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

int safechar(char c)
{
  if (c >= 'a' && c <= 'z') return(c);
  if (c >= 'A' && c <= 'Z') return(c);
  if (c >= '0' && c <= '9') return(c);
  if (c == ' ') return(c);
  if (c == '.') return(c);
  if (c == '-') return(c);
  if (c == ',') return(c);
  if (c == '(') return(c);
  if (c == ')') return(c);
  if (c == '[') return(c);
  if (c == ']') return(c);
  if (c == '{') return(c);
  if (c == '}') return(c);
  return '@';
}
main(int argc, char **argv, char **envp)
{
  char **s;
  char *s2;
  int i, top;

  if (argc < 2) {
    fprintf(stderr, "usage: printstack nentries (& other junk if you want)\n");
    exit(1);
  }

  top = atoi(argv[1]);

  printf("&s =    0x%lx\n", (unsigned long) &s);
  printf("&argc = 0x%lx\n", (unsigned long) &argc);
  printf("&argv = 0x%lx\n", (unsigned long) &argv);
  printf("&envp = 0x%lx\n", (unsigned long) &envp);
  printf("\n");

  s = (char **) &s;
  if (((char **) &argc) < s) s = (char **) &argc;
  if (((char **) &argv) < s) s = (char **) &argv;
  if (((char **) &envp) < s) s = (char **) &envp;
  if (((char **) &top) < s) s = (char **) &top;

  for (i = 0; i < top; i++) {
    s2 = (char *) s;
    printf("0x%lx : %20ld 0x%-16lx %2c %2c %2c %2c %2c %2c %2c %2c\n", s, *s, *s, 
        safechar(s2[0]), safechar(s2[1]), safechar(s2[2]), safechar(s2[3]),
        safechar(s2[4]), safechar(s2[5]), safechar(s2[6]), safechar(s2[7]));
    fflush(stdout);
    s++;
  }
}

