Пример #1
0
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));
}
Пример #2
0
/*
 * 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);
	}
}