summaryrefslogtreecommitdiff
path: root/source3/aparser
diff options
context:
space:
mode:
authorAndrew Tridgell <tridge@samba.org>2000-06-09 02:59:50 +0000
committerAndrew Tridgell <tridge@samba.org>2000-06-09 02:59:50 +0000
commiteee003da6aee5ffc00e318fc0390e6b19151a675 (patch)
tree3cdb43304603d5bc38c2b2609fa8696731c898d5 /source3/aparser
parentc3487b00dd1dde7fa0511211f466acc1c05d8f3d (diff)
downloadsamba-eee003da6aee5ffc00e318fc0390e6b19151a675.tar.gz
samba-eee003da6aee5ffc00e318fc0390e6b19151a675.tar.bz2
samba-eee003da6aee5ffc00e318fc0390e6b19151a675.zip
started adding support for relative, plus options for autoalignment
so the same parser generator can be uses for cifs and rpc (This used to be commit c7829fa0d87081d9b3f33468527583e3b763916b)
Diffstat (limited to 'source3/aparser')
-rw-r--r--source3/aparser/Makefile2
-rwxr-xr-xsource3/aparser/build2
-rw-r--r--source3/aparser/cifs.struct3
-rw-r--r--source3/aparser/dump.awk6
-rw-r--r--source3/aparser/header.awk10
-rw-r--r--source3/aparser/main.awk9
-rw-r--r--source3/aparser/parser.c20
-rw-r--r--source3/aparser/parser.h19
-rw-r--r--source3/aparser/parserel.awk213
-rw-r--r--source3/aparser/parsetree.awk12
-rw-r--r--source3/aparser/spool.struct36
-rw-r--r--source3/aparser/srvsvc2.struct5
-rw-r--r--source3/aparser/templates/module_start.tpl1
-rw-r--r--source3/aparser/token.awk5
-rw-r--r--source3/aparser/util.awk6
-rw-r--r--source3/aparser/util.c112
-rw-r--r--source3/aparser/vluke.c2
17 files changed, 421 insertions, 42 deletions
diff --git a/source3/aparser/Makefile b/source3/aparser/Makefile
index 68e63193c2..953743b234 100644
--- a/source3/aparser/Makefile
+++ b/source3/aparser/Makefile
@@ -1,7 +1,7 @@
CFLAGS=-Wall -g
CC=gcc
-OBJ = vluke.o parser.o util.o
+OBJ = vluke.o parser.o
AWKPROGS=dump.awk harness.awk header.awk parsefn.awk main.awk parsetree.awk template.awk util.awk
all: test.h vluke
diff --git a/source3/aparser/build b/source3/aparser/build
index 574cad9620..4cdf2901f8 100755
--- a/source3/aparser/build
+++ b/source3/aparser/build
@@ -8,6 +8,6 @@ if ! igawk -f main.awk $file; then
fi
echo compiling vluke
-gcc -Wall -o vluke parser.c vluke.c util.c
+gcc -Wall -g -o vluke parser.c vluke.c util.c
echo done.
diff --git a/source3/aparser/cifs.struct b/source3/aparser/cifs.struct
index 9bafa1f930..202f0d7e61 100644
--- a/source3/aparser/cifs.struct
+++ b/source3/aparser/cifs.struct
@@ -1,5 +1,8 @@
module cifs
+option autoalign False
+
+
#define BOOL uint32
#define UCHAR uint8
#define WCHAR uint16
diff --git a/source3/aparser/dump.awk b/source3/aparser/dump.awk
index 65e5675513..11bfb107e4 100644
--- a/source3/aparser/dump.awk
+++ b/source3/aparser/dump.awk
@@ -52,6 +52,12 @@ function dump_structs(f, NIL,
LOCAL, i, j)
{
xprintf(f,"/* dump of parsed structures */\n\n\n");
+
+ for (i=0;i < num_options;i++) {
+ xprintf(f,"option %s %s\n", options[i, "name"], options[i, "value"]);
+ }
+ xprintf(f,"\n\n");
+
for (i=0;i < num_structs;i++) {
xprintf(f,"/* structure %d */\n", i);
xprintf(f,"struct %s {\n", structs[i, "name"]);
diff --git a/source3/aparser/header.awk b/source3/aparser/header.awk
index 900985b84b..ba7117436b 100644
--- a/source3/aparser/header.awk
+++ b/source3/aparser/header.awk
@@ -7,7 +7,7 @@ function header_elstring(elnum,
elem=elements[elnum, "elem"];
if (elements[elnum, "ptr"]=="1") elem="*"elem;
if (array_len!="") {
- if (match(array_len,"[0-9]") == 1) {
+ if (is_constant(array_len) == 1) {
elem=elem"["array_len"]";
} else {
elem="*"elem;
@@ -63,6 +63,14 @@ function produce_headers(f, NIL,
xprintf(f,"/* auto-generated headers for %s */\n\n\n", module);
xprintf(f,"#ifndef _%s_\n", module);
xprintf(f,"#define _%s_\n", module);
+
+ xprintf(f,"\n\n");
+ for (i=0;i < num_options;i++) {
+ xprintf(f,"#define OPTION_%s %s\n",
+ options[i, "name"], options[i, "value"]);
+ }
+ xprintf(f,"\n\n");
+
for (i=0;i < num_structs;i++) {
header_struct(f, i);
}
diff --git a/source3/aparser/main.awk b/source3/aparser/main.awk
index 7163dbc829..4969f2217a 100644
--- a/source3/aparser/main.awk
+++ b/source3/aparser/main.awk
@@ -4,7 +4,8 @@
@include header.awk
@include util.awk
@include template.awk
-@include parsefn.awk
+#@include parsefn.awk
+@include parserel.awk
@include harness.awk
@include parsetree.awk
@include token.awk
@@ -13,8 +14,10 @@ END {
dump_structs("dump.out");
printf("Producing headers...\n");
produce_headers("prs_"module".h");
- printf("Producing parsers...\n");
- produce_parsers("prs_"module".c", "mod_"module".c");
+# printf("Producing parsers...\n");
+# produce_parsers("prs_"module".c", "mod_"module".c");
+ printf("Producing relative parsers...\n");
+ produce_relative("prs_"module".c");
printf("Producing harness...\n");
produce_harness("test.h");
printf("Done.\n");
diff --git a/source3/aparser/parser.c b/source3/aparser/parser.c
index f831393973..c2348b84f9 100644
--- a/source3/aparser/parser.c
+++ b/source3/aparser/parser.c
@@ -1,5 +1,4 @@
-#include "includes.h"
-
+#include "parser.h"
/*******************************************************************
Attempt, if needed, to grow a data buffer.
@@ -33,12 +32,7 @@ BOOL io_grow(io_struct *ps, uint32 extra_space)
extra_space -= (ps->buffer_size - ps->data_offset);
if(ps->buffer_size == 0) {
- /*
- * Ensure we have at least a PDU's length, or extra_space, whichever
- * is greater.
- */
-
- new_size = MAX(MAX_PDU_FRAG_LEN,extra_space);
+ new_size = extra_space;
if((new_data = malloc(new_size)) == NULL) {
DEBUG(0,("io_grow: Malloc failure for size %u.\n", (unsigned int)new_size));
@@ -169,10 +163,12 @@ BOOL io_align4(io_struct *ps, int offset)
BOOL io_align(io_struct *ps, int align)
{
- uint32 mod = ps->data_offset & (align-1);
+ uint32 mod;
+
+ if (!ps->autoalign) return True;
+
+ mod = ps->data_offset & (align-1);
- return True; /* HACK! */
-
if (align != 0 && mod != 0) {
uint32 extra_space = (align - mod);
if(!io_grow(ps, extra_space))
@@ -430,7 +426,7 @@ BOOL io_wstring(char *name, io_struct *ps, int depth, uint16 *data16s, int len,
q = io_mem_get(ps, len * sizeof(uint16));
if (q == NULL) return False;
- DBG_RW_PSVAL(False, name, depth, ps->data_offset, ps->io, ps->bigendian_data, q, data16s, len)
+ DBG_RW_PSVAL(True, name, depth, ps->data_offset, ps->io, ps->bigendian_data, q, data16s, len)
ps->data_offset += (len * sizeof(uint16));
return True;
diff --git a/source3/aparser/parser.h b/source3/aparser/parser.h
index e5e5a757cb..3d6540d8a7 100644
--- a/source3/aparser/parser.h
+++ b/source3/aparser/parser.h
@@ -1,4 +1,9 @@
#include <ctype.h>
+#include <stdio.h>
+#include <malloc.h>
+#include <unistd.h>
+#include <sys/stat.h>
+#include <fcntl.h>
#include "../include/byteorder.h"
#define PARSE_SCALARS (1<<0)
@@ -11,10 +16,9 @@
#ifndef MAX
#define MAX(a,b) ((a)>(b)?(a):(b))
#endif
-/* Maximum PDU fragment size. */
-#define MAX_PDU_FRAG_LEN 0x1630
#define DEBUG(lvl, str) printf str;
+#define DEBUGADD(lvl, str) printf str;
#define MARSHALL 0
#define UNMARSHALL 1
@@ -24,11 +28,15 @@
typedef int BOOL;
typedef unsigned char uint8;
+typedef unsigned char uchar;
typedef unsigned short uint16;
typedef unsigned short wchar;
typedef unsigned uint32;
typedef char *SMBSTR;
+/* a null terminated unicode string */
+typedef uint16 ZUSTRING;
+
#ifndef _PSTRING
#define PSTRING_LEN 1024
@@ -59,6 +67,7 @@ typedef struct _io_struct
*/
BOOL bigendian_data;
BOOL is_dynamic; /* Do we own this memory or not ? */
+ BOOL autoalign; /* should we auto-align all elements? */
uint32 data_offset; /* Current working offset into data. */
uint32 buffer_size; /* Current size of the buffer. */
uint32 grow_size; /* size requested via io_grow() calls */
@@ -72,7 +81,6 @@ void io_debug(io_struct *ps, int depth, char *desc, char *fn_name);
BOOL io_align(io_struct *ps, int align);
BOOL io_align4(io_struct *ps, int align);
BOOL io_align2(io_struct *ps, int align);
-void print_asc(int level, unsigned char *buf,int len);
BOOL io_read(io_struct *ps, int fd, size_t len, int timeout);
void dump_data(int level,char *buf1,int len);
BOOL io_alloc(char *name, io_struct *ps, void **ptr, unsigned size);
@@ -88,5 +96,8 @@ BOOL io_uint8s(char *name, io_struct *ps, int depth, uint8 **data8s, int len, un
char *tab_depth(int depth);
void *Realloc(void *p,size_t size);
-void print_asc(int level, unsigned char *buf,int len);
void dump_data(int level,char *buf1,int len);
+void print_asc(int level, uchar const *buf, int len);
+BOOL io_ZUSTRING(char *name, io_struct *ps, int depth, uint16 **ustr, unsigned flags);
+size_t strlen_w(void *src);
+
diff --git a/source3/aparser/parserel.awk b/source3/aparser/parserel.awk
new file mode 100644
index 0000000000..6d80f0607e
--- /dev/null
+++ b/source3/aparser/parserel.awk
@@ -0,0 +1,213 @@
+# build parse functions for a parsed struct file
+
+function elem_name(v, elem)
+{
+ return v["UNION"]elem;
+}
+
+function parse_array(f, v, elnum, flags,
+ LOCAL, type, elem, array_len)
+{
+ type = elements[elnum, "type"];
+ elem = elements[elnum, "elem"];
+ array_len = elements[elnum, "array_len"];
+ v["ELEM"] = elem_name(v, elem);
+ v["TYPE"] = type;
+ v["FLAGS"] = flags;
+ v["ARRAY_LEN"] = array_len;
+
+ if (array_len=="+") {
+ print_template(f,"prs_array_optional.tpl", v);
+ return;
+ }
+
+ if (array_len=="&") {
+ print_template(f,"prs_array_null.tpl", v);
+ return;
+ }
+
+ if (array_len=="*") {
+ print_template(f,"prs_array_remainder.tpl", v);
+ return;
+ }
+
+ if (type == "wchar" || type == "uint16") {
+ if (match(array_len,"[0-9]") == 1) {
+ print_template(f, "prs_wstring_fixed.tpl", v);
+ } else {
+ print_template(f, "prs_wstring.tpl", v);
+ }
+ } else if (type == "uint8") {
+ if (match(array_len,"[0-9]") == 1) {
+ print_template(f, "prs_uint8s_fixed.tpl", v);
+ } else {
+ print_template(f, "prs_uint8s.tpl", v);
+ }
+ } else {
+ print_template(f, "prs_array.tpl", v);
+ }
+}
+
+
+function parse_element(f, v, elnum, flags,
+ LOCAL, type, elem)
+{
+ if (elements[elnum,"nowire"] != "") {
+ return;
+ }
+ type = elements[elnum, "type"];
+ if (substr(type,1,1) == ".") return;
+ elem = elements[elnum, "elem"];
+ if (elements[elnum,"ptr"] == "") {
+ v["PTR"] = "\\&";
+ } else {
+ v["PTR"] = " ";
+ }
+ v["ELEM"] = elem_name(v, elem);
+ v["TYPE"] = type;
+ v["FLAGS"] = flags;
+ print_template(f, "prs_element.tpl", v);
+}
+
+function parse_union(f, v, elnum, flags,
+ LOCAL, i)
+{
+ v["UNION"] = elements[elnum, "elem"];
+ v["SWITCH"] = elements[elnum, "switch"];
+
+ if (elements[elnum, "ptr"] == "1") {
+ v["UNION"] = v["UNION"]"->";
+ } else {
+ v["UNION"] = v["UNION"]".";
+ }
+
+ print_template(f, "union_start.tpl", v);
+ for (i=0;i<unions[elnum, "num_elems"];i++) {
+ v["CASE"] = elements[unions[elnum, i], "case"];
+ print_template(f, "prs_case.tpl", v);
+ if (elements[elnum, "ptr"] == "1") {
+ parse_scalars(f, v, unions[elnum, i], "PARSE_SCALARS");
+ parse_buffers(f, v, unions[elnum, i], "PARSE_BUFFERS");
+ } else {
+ if (flags == "PARSE_SCALARS") {
+ parse_scalars(f, v, unions[elnum, i], flags);
+ } else {
+ parse_buffers(f, v, unions[elnum, i], flags);
+ }
+ }
+ print_template(f, "prs_break.tpl", v);
+ }
+ v["UNION"] = "";
+
+ print_template(f, "union_end.tpl", v);
+}
+
+function parse_scalar(f, v, elnum, flags)
+{
+ if (elements[elnum, "type"] == "union") {
+ parse_union(f, v, elnum, flags);
+ } else if (elements[elnum, "array_len"]!="") {
+ parse_array(f, v, elnum, flags);
+ } else {
+ parse_element(f, v, elnum, flags);
+ }
+}
+
+function parse_pointer(f, v, elnum, flags,
+ LOCAL, elem)
+{
+ elem = elements[elnum, "elem"];
+ v["ELEM"] = elem_name(v, elem);
+ v["FLAGS"] = flags;
+ print_template(f, "prs_pointer.tpl", v);
+}
+
+function parse_scalars(f, v, elnum, flags)
+{
+ if (elements[elnum, "ptr"] == "1") {
+ parse_pointer(f, v, elnum, flags);
+ } else {
+ parse_scalar(f, v, elnum, flags);
+ }
+}
+
+function parse_buffers(f, v, elnum, flags,
+ LOCAL, elem, type)
+{
+ elem = elements[elnum, "elem"];
+ type = elements[elnum, "type"];
+ v["ELEM"] = elem_name(v, elem);
+ if (elements[elnum, "ptr"] == "1") {
+ print_template(f, "ifptr_start.tpl", v);
+ parse_scalar(f, v, elnum, "PARSE_SCALARS|PARSE_BUFFERS");
+ print_template(f, "ifptr_end.tpl", v);
+ } else {
+ parse_scalar(f, v, elnum, flags);
+ }
+}
+
+function struct_immediate(f, v, struct_num,
+ LOCAL, i, n1, num_elems)
+{
+ num_elems = structs[struct_num, "num_elems"];
+ v["STRUCTNAME"] = structs[struct_num, "name"];
+ v["FUNCNAME"] = "io_" v["STRUCTNAME"];
+
+ print_template(f, "fn_i_start.tpl", v);
+
+ for (i=0;i<num_elems;i++) {
+ parse_scalars(f, v, structs[struct_num, i], "PARSE_SCALARS");
+ parse_buffers(f, v, structs[struct_num, i], "PARSE_BUFFERS");
+ }
+
+ print_template(f, "fn_i_end.tpl", v);
+}
+
+
+function struct_recursive(f, v, struct_num,
+ LOCAL, i, n1, num_elems)
+{
+ num_elems = structs[struct_num, "num_elems"];
+ v["STRUCTNAME"] = structs[struct_num, "name"];
+ v["FUNCNAME"] = "io_" v["STRUCTNAME"];
+
+ print_template(f, "fn_start.tpl", v);
+
+# first all the structure pointers, scalars and arrays
+ for (i=0;i<num_elems;i++) {
+ parse_scalars(f, v, structs[struct_num, i], "PARSE_SCALARS");
+ }
+
+ print_template(f, "fn_mid.tpl", v);
+
+# now the buffers
+ for (i=0;i<num_elems;i++) {
+ parse_buffers(f, v, structs[struct_num, i], "PARSE_BUFFERS");
+ }
+
+ print_template(f, "fn_end.tpl", v);
+}
+
+function struct_parser(f, v, struct_num,
+ LOCAL, i, n1, num_elems)
+{
+ if (structs[struct_num, "recurse"] == "True") {
+ struct_recursive(f, v, struct_num);
+ } else {
+ struct_immediate(f, v, struct_num);
+ }
+}
+
+function produce_relative(f,
+ LOCAL, v, i)
+{
+ v["MODULE"]=module;
+
+ print_template(f, "module_start.tpl", v);
+
+ for (i=0;i < num_structs;i++) {
+ struct_parser(f, v, i);
+ }
+
+ print_template(f, "module_end.tpl", v);
+}
diff --git a/source3/aparser/parsetree.awk b/source3/aparser/parsetree.awk
index bb1160b954..80587a0111 100644
--- a/source3/aparser/parsetree.awk
+++ b/source3/aparser/parsetree.awk
@@ -16,6 +16,15 @@ function start_module(name)
num_elements=0;
num_unions=0;
num_tests=0;
+ num_options=0;
+}
+
+function set_option(name, value)
+{
+ options[name] = value;
+ options[num_options, "name"] = name;
+ options[num_options, "value"] = value;
+ num_options++;
}
function parse_define(def1, def2,
@@ -31,6 +40,7 @@ function start_struct(name)
structs[current_struct, "name"]=name;
structs[current_struct, "num_elems"]=0;
structs[current_struct, "num_unions"]=0;
+ structs[current_struct, "recurse"] = options["recurse"];
}
function end_struct(name)
@@ -168,7 +178,7 @@ function add_sizeis_array(count, type, elem)
function start_function(type, fname)
{
start_struct(fname);
- add_function_param("[in,out]",".trailer", "");
+ structs[current_struct, "recurse"] = "False";
}
function end_function(LOCAL, i)
diff --git a/source3/aparser/spool.struct b/source3/aparser/spool.struct
index 29bd9bc55f..1563ba5be0 100644
--- a/source3/aparser/spool.struct
+++ b/source3/aparser/spool.struct
@@ -50,24 +50,24 @@ struct PRINTER_DRIVER_INFO_LEVEL_3 {
};
struct PRINTER_DRIVER_INFO_LEVEL_6 {
- DWORD dummy1;
- DWORD version;
- LPWSTR name;
- LPWSTR environment;
- LPWSTR driverpath;
- LPWSTR datafile;
- LPWSTR configfile;
- LPWSTR helpfile;
- LPWSTR monitorname;
- LPWSTR defaultdatatype;
- BUFFERP dependentfiles;
- BUFFERP previousnames;
- NTTIME driverdate;
- VERSION driverversion;
- LPWSTR mfgname;
- LPWSTR oemurl;
- LPWSTR hardwareid;
- LPWSTR provider;
+ DWORD dummy1;
+ DWORD version;
+ LPWSTR name;
+ LPWSTR environment;
+ LPWSTR driverpath;
+ LPWSTR datafile;
+ LPWSTR configfile;
+ LPWSTR helpfile;
+ LPWSTR monitorname;
+ LPWSTR defaultdatatype;
+ BUFFERP dependentfiles;
+ BUFFERP previousnames;
+ NTTIME driverdate;
+ VERSION driverversion;
+ LPWSTR mfgname;
+ LPWSTR oemurl;
+ LPWSTR hardwareid;
+ LPWSTR provider;
};
diff --git a/source3/aparser/srvsvc2.struct b/source3/aparser/srvsvc2.struct
index bc80d3bc05..362d121e37 100644
--- a/source3/aparser/srvsvc2.struct
+++ b/source3/aparser/srvsvc2.struct
@@ -1,5 +1,10 @@
module srvsvc
+option autoalign True
+option relative False
+option recurse True
+option foo blah
+
#define BOOL uint32
#define LONG uint32
#define DWORD uint32
diff --git a/source3/aparser/templates/module_start.tpl b/source3/aparser/templates/module_start.tpl
index 5bcdbf3275..ac6a3c9d98 100644
--- a/source3/aparser/templates/module_start.tpl
+++ b/source3/aparser/templates/module_start.tpl
@@ -1,6 +1,5 @@
/* auto-generated structure parsers for @MODULE@
generated by aparser
*/
-#include "includes.h"
#include "prs_@MODULE@.h"
diff --git a/source3/aparser/token.awk b/source3/aparser/token.awk
index 9920de562b..25ac06f6e3 100644
--- a/source3/aparser/token.awk
+++ b/source3/aparser/token.awk
@@ -34,6 +34,11 @@ function parse_error(msg) {
{if (module=="") parse_error("you must specify the module name first");}
+/^[ \t]*option/ {
+ set_option($2, $3);
+ next;
+}
+
/^[ \t]*typedef struct.*\{/ {
{if (current_struct!="") parse_error("you cannot have nested structures");}
start_struct($3);
diff --git a/source3/aparser/util.awk b/source3/aparser/util.awk
index 93f9a4dcd2..6c5594da68 100644
--- a/source3/aparser/util.awk
+++ b/source3/aparser/util.awk
@@ -31,3 +31,9 @@ function numlines(fname,
close(fname);
return count;
}
+
+# return 1 if the string is a constant
+function is_constant(s)
+{
+ return match(s,"^[0-9]+$");
+}
diff --git a/source3/aparser/util.c b/source3/aparser/util.c
new file mode 100644
index 0000000000..ffa84dbfab
--- /dev/null
+++ b/source3/aparser/util.c
@@ -0,0 +1,112 @@
+#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"));
+ }
+}
diff --git a/source3/aparser/vluke.c b/source3/aparser/vluke.c
index 87664267d0..d3868f2753 100644
--- a/source3/aparser/vluke.c
+++ b/source3/aparser/vluke.c
@@ -1,3 +1,4 @@
+#include "parser.h"
#include "test.h"
int main(int argc, char *argv[])
@@ -29,6 +30,7 @@ int main(int argc, char *argv[])
ps.data_offset = 0;
ps.buffer_size = ps.grow_size;
ps.io = UNMARSHALL;
+ ps.autoalign = OPTION_autoalign;
ret = run_test(test, &ps, PARSE_SCALARS|PARSE_BUFFERS);
printf("\nret=%s\n", ret?"OK":"Bad");
printf("Trailer is %d bytes\n\n", ps.grow_size - ps.data_offset);