testprogs: add print_printer_dataw and dump_data to printlib.
[ira/wip.git] / testprogs / win32 / spoolss / printlib.c
index f3541c85e19df4f7d39b8acf23dc3b751523bfa9..e0fb6e7a1e11f5a0ef342f78bbb0a230db42a3e5 100644 (file)
 #include <assert.h>
 #include <sddl.h>
 
+#ifndef MIN
+#define MIN(a,b) ((a)<(b)?(a):(b))
+#endif
+
 void print_devmode(DEVMODE *pDevModeIn)
 {
        if (pDevModeIn == NULL) {
@@ -1158,23 +1162,66 @@ LPSTR reg_type_str(DWORD type)
        }
 }
 
-void print_printer_data(LPSTR keyname, LPSTR valuename, DWORD size, LPBYTE buffer, DWORD type)
+void print_asc(const BYTE *buf, DWORD len)
 {
-       DWORD i = 0;
-       LPSTR p = NULL;
-
-       if (keyname) {
-               printf("\tKey Name:\t%s\n", keyname);
+       int i;
+       for (i=0; i<len; i++) {
+               printf("%c", isprint(buf[i])?buf[i]:'.');
        }
+}
 
-       printf("\tValue Name:\t%s\n", valuename);
-       printf("\tSize:\t\t0x%x (%d)\n", size, size);
-       printf("\tType:\t\t%s\n", reg_type_str(type));
+static void dump_data(const BYTE *buf, int len)
+{
+       int i=0;
+       static const BYTE empty[16] = { 0, };
 
-       if (buffer == NULL || size == 0) {
-               return;
+       if (len<=0) return;
+
+       for (i=0; i<len;) {
+
+               if (i%16 == 0) {
+                       if ((i > 0) &&
+                           (len > i+16) &&
+                           (memcmp(&buf[i], &empty, 16) == 0))
+                       {
+                               i +=16;
+                               continue;
+                       }
+
+                       if (i<len)  {
+                               printf("[%04X] ",i);
+                       }
+               }
+
+               printf("%02x ", buf[i]);
+               i++;
+
+               if (i%8 == 0) printf("  ");
+               if (i%16 == 0) {
+                       print_asc(&buf[i-16],8); printf(" ");
+                       print_asc(&buf[i-8],8); printf("\n");
+               }
        }
 
+       if (i%16) {
+               int n;
+               n = 16 - (i%16);
+               printf(" ");
+               if (n>8) printf(" ");
+               while (n--) printf("   ");
+               n = MIN(8,i%16);
+               print_asc(&buf[i-(i%16)],n); printf( " " );
+               n = (i%16) - n;
+               if (n>0) print_asc(&buf[i-n],n);
+               printf("\n");
+       }
+}
+
+static void dump_printer_data(DWORD size, LPBYTE buffer, DWORD type)
+{
+       DWORD i = 0;
+       LPSTR p = NULL;
+
        switch (type) {
        case REG_SZ:
                printf("\t\t");
@@ -1209,6 +1256,41 @@ void print_printer_data(LPSTR keyname, LPSTR valuename, DWORD size, LPBYTE buffe
        }
 }
 
+void print_printer_data(LPSTR keyname, LPSTR valuename, DWORD size, LPBYTE buffer, DWORD type)
+{
+       if (keyname) {
+               printf("\tKey Name:\t%s\n", keyname);
+       }
+
+       printf("\tValue Name:\t%s\n", valuename);
+       printf("\tSize:\t\t0x%x (%d)\n", size, size);
+       printf("\tType:\t\t%s\n", reg_type_str(type));
+
+       if (buffer == NULL || size == 0) {
+               return;
+       }
+
+       dump_printer_data(size, buffer, type);
+}
+
+void print_printer_dataw(LPCWSTR keyname, LPCWSTR valuename, DWORD size, LPBYTE buffer, DWORD type)
+{
+       if (keyname) {
+               printf("\tKey Name:\t%ls\n", keyname);
+       }
+
+       printf("\tValue Name:\t%ls\n", valuename);
+       printf("\tSize:\t\t0x%x (%d)\n", size, size);
+       printf("\tType:\t\t%s\n", reg_type_str(type));
+
+       if (buffer == NULL || size == 0) {
+               return;
+       }
+
+       dump_printer_data(size, buffer, type);
+}
+
+
 void print_printer_enum_values(PRINTER_ENUM_VALUES *info)
 {
        print_printer_data(NULL, info->pValueName, info->cbData, info->pData, info->dwType);