mirror of
https://github.com/samba-team/samba.git
synced 2024-12-25 23:21:54 +03:00
c7829fa0d8
so the same parser generator can be uses for cifs and rpc
113 lines
2.2 KiB
C
113 lines
2.2 KiB
C
#include "parser.h"
|
|
|
|
|
|
/*******************************************************************
|
|
Count the number of characters (not bytes) in a unicode string.
|
|
********************************************************************/
|
|
size_t strlen_w(void *src)
|
|
{
|
|
size_t len;
|
|
|
|
for (len = 0; SVAL(src, len*2); len++) ;
|
|
|
|
return len;
|
|
}
|
|
|
|
/****************************************************************************
|
|
expand a pointer to be a particular size
|
|
****************************************************************************/
|
|
void *Realloc(void *p,size_t size)
|
|
{
|
|
void *ret=NULL;
|
|
|
|
if (size == 0) {
|
|
if (p) free(p);
|
|
DEBUG(5,("Realloc asked for 0 bytes\n"));
|
|
return NULL;
|
|
}
|
|
|
|
if (!p)
|
|
ret = (void *)malloc(size);
|
|
else
|
|
ret = (void *)realloc(p,size);
|
|
|
|
if (!ret)
|
|
DEBUG(0,("Memory allocation error: failed to expand to %d bytes\n",(int)size));
|
|
|
|
return(ret);
|
|
}
|
|
|
|
|
|
char *tab_depth(int depth)
|
|
{
|
|
static pstring spaces;
|
|
memset(spaces, ' ', depth * 4);
|
|
spaces[depth * 4] = 0;
|
|
return spaces;
|
|
}
|
|
|
|
void print_asc(int level, uchar const *buf, int len)
|
|
{
|
|
int i;
|
|
for (i = 0; i < len; i++)
|
|
{
|
|
DEBUGADD(level, ("%c", isprint(buf[i]) ? buf[i] : '.'));
|
|
}
|
|
}
|
|
|
|
void dump_data(int level, char *buf1, int len)
|
|
{
|
|
uchar const *buf = (uchar const *)buf1;
|
|
int i = 0;
|
|
if (buf == NULL)
|
|
{
|
|
DEBUG(level, ("dump_data: NULL, len=%d\n", len));
|
|
return;
|
|
}
|
|
if (len < 0)
|
|
return;
|
|
if (len == 0)
|
|
{
|
|
DEBUG(level, ("\n"));
|
|
return;
|
|
}
|
|
|
|
DEBUG(level, ("[%03X] ", i));
|
|
for (i = 0; i < len;)
|
|
{
|
|
DEBUGADD(level, ("%02X ", (int)buf[i]));
|
|
i++;
|
|
if (i % 8 == 0)
|
|
DEBUGADD(level, (" "));
|
|
if (i % 16 == 0)
|
|
{
|
|
print_asc(level, &buf[i - 16], 8);
|
|
DEBUGADD(level, (" "));
|
|
print_asc(level, &buf[i - 8], 8);
|
|
DEBUGADD(level, ("\n"));
|
|
if (i < len)
|
|
DEBUGADD(level, ("[%03X] ", i));
|
|
}
|
|
}
|
|
|
|
if (i % 16 != 0) /* finish off a non-16-char-length row */
|
|
{
|
|
int n;
|
|
|
|
n = 16 - (i % 16);
|
|
DEBUGADD(level, (" "));
|
|
if (n > 8)
|
|
DEBUGADD(level, (" "));
|
|
while (n--)
|
|
DEBUGADD(level, (" "));
|
|
|
|
n = MIN(8, i % 16);
|
|
print_asc(level, &buf[i - (i % 16)], n);
|
|
DEBUGADD(level, (" "));
|
|
n = (i % 16) - n;
|
|
if (n > 0)
|
|
print_asc(level, &buf[i - n], n);
|
|
DEBUGADD(level, ("\n"));
|
|
}
|
|
}
|