
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define DEBUG 1

void hexdump (char *desc, unsigned char *data, unsigned int amount);


int jim(char *str)
{
   char buf[256];
   strcpy(buf,str);
   return 0;
}

int main(int argc, char **argv)
{
   int i;

   unsigned long sp = (unsigned long) argv[0];

   if( argc < 2 ) {
        fprintf(stderr, "Usage: %s buffer\n\n",argv[0]);
        exit(-1);
        }

   for( i = 0; i< argc; i++)
        printf("argv[%d]: 0x%p\n", i, argv[i]);

   printf("\n");

   if( DEBUG != 0 )
                hexdump("Stack from argv[0]",argv[0], (( sp |  0xffff) & 0xfffffffc) - sp);

   jim(argv[1]);

   return 0;
}

void
hexdump (char *desc, unsigned char *data, unsigned int amount)
{
        unsigned int    dp, p;  /* data pointer */
        const char      trans[] =
                "................................ !\"#$%&'()*+,-./0123456789"
                ":;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklm"
                "nopqrstuvwxyz{|}~...................................."
                "....................................................."
                "........................................";


        printf ("/* %s, %u bytes */\n", desc, amount);

        fprintf (stderr, "0x%p  ", &data[0]);

        for (dp = 1; dp <= amount; dp++) {
                fprintf (stderr, "%02x ", data[dp-1]);
                if ((dp % 4)== 0)
                        fprintf (stderr, " ");
                if ((dp % 16) == 0) {
                        fprintf (stderr, "| ");
                        p = dp;
                        for (dp -= 16; dp < p; dp++)
                                fprintf (stderr, "%c", trans[data[dp]]);
                        fflush (stderr);
                        fprintf (stderr, "\n");
                        fprintf (stderr, "0x%p  ", &data[dp]);
                }
                fflush (stderr);
        }

        if ((amount % 16) != 0) {
                p = dp = 16 - (amount % 16);
                for (dp = p; dp > 0; dp--) {
                        fprintf (stderr, "   ");
                        if (((dp % 8) == 0) && (p != 8))
                                fprintf (stderr, " ");
                        fflush (stderr);
                }
                fprintf (stderr, "  | ");
                for (dp = (amount - (16 - p)); dp < amount; dp++)
                        fprintf (stderr, "%c", trans[data[dp]]);
                fflush (stderr);
        }
        fprintf (stderr, "\n");

        return;
}



