int od_main(int argc, char **argv) { int ch; extern enum _vflag vflag; vflag = FIRST; length = -1; while ((ch = getopt(argc, argv, "aBbcDdeFfHhIiLlOoPpswvXx")) != EOF) switch (ch) { case 'a': odprecede(); add("16/1 \"%3_u \" \"\\n\""); break; case 'B': case 'o': odprecede(); add("8/2 \" %06o \" \"\\n\""); break; case 'b': odprecede(); add("16/1 \"%03o \" \"\\n\""); break; case 'c': odprecede(); add("16/1 \"%3_c \" \"\\n\""); break; case 'd': odprecede(); add("8/2 \" %05u \" \"\\n\""); break; case 'D': odprecede(); add("4/4 \" %010u \" \"\\n\""); break; case 'e': /* undocumented in od */ case 'F': odprecede(); add("2/8 \" %21.14e \" \"\\n\""); break; case 'f': odprecede(); add("4/4 \" %14.7e \" \"\\n\""); break; case 'H': case 'X': odprecede(); add("4/4 \" %08x \" \"\\n\""); break; case 'h': case 'x': odprecede(); add("8/2 \" %04x \" \"\\n\""); break; case 'I': case 'L': case 'l': odprecede(); add("4/4 \" %11d \" \"\\n\""); break; case 'i': odprecede(); add("8/2 \" %6d \" \"\\n\""); break; case 'O': odprecede(); add("4/4 \" %011o \" \"\\n\""); break; case 'v': vflag = ALL; break; case 'P': case 'p': case 's': case 'w': case '?': default: error_msg("od: od(1) has been deprecated for hexdump(1).\n"); if (ch != '?') { error_msg("od: hexdump(1) compatibility doesn't support the -%c option%s\n", ch, ch == 's' ? "; see strings(1)." : "."); } show_usage(); } if (!fshead) { add("\"%07.7_Ao\n\""); add("\"%07.7_ao \" 8/2 \"%06o \" \"\\n\""); } argc -= optind; argv += optind; odoffset(argc, &argv); return(dump(argv)); }
/* * Interpret a POSIX-style -t argument. */ static void posixtypes(char const *type_string) { int nbytes = 0; char *fmt, type, *tmp; struct odformat const *odf; while (*type_string) { odprecede(); switch ((type = *type_string++)) { case 'a': case 'c': nbytes = 1; break; case 'f': if (isupper((unsigned char)*type_string)) { switch(*type_string) { case 'F': nbytes = sizeof(float); break; case 'D': nbytes = sizeof(double); break; case 'L': nbytes = sizeof(long double); break; default: warnx("Bad type-size qualifier '%c'", *type_string); usage(); } type_string++; } else if (isdigit((unsigned char)*type_string)) { nbytes = strtol(type_string, &tmp, 10); type_string = tmp; } else nbytes = 8; break; case 'd': case 'o': case 'u': case 'x': if (isupper((unsigned char)*type_string)) { switch(*type_string) { case 'C': nbytes = sizeof(char); break; case 'S': nbytes = sizeof(short); break; case 'I': nbytes = sizeof(int); break; case 'L': nbytes = sizeof(long); break; default: warnx("Bad type-size qualifier '%c'", *type_string); usage(); } type_string++; } else if (isdigit((unsigned char)*type_string)) { nbytes = strtol(type_string, &tmp, 10); type_string = tmp; } else nbytes = 4; break; default: usage(); } for (odf = odftab; odf->type != 0; odf++) if (odf->type == type && odf->nbytes == nbytes) break; if (odf->type == 0) errx(1, "%c%d: format not supported", type, nbytes); (void)easprintf(&fmt, "%d/%d \"%*s%s \" \"\\n\"", 16 / nbytes, nbytes, 4 * nbytes - odf->minwidth, "", odf->format); add(fmt); } }