int main(int argc, char *argv[]){ char str[1024]; int num = 0; int format = HEX; char opt; memset(str, 0, 1024); while((opt=getopt(argc, argv, "oxb")) != -1){ switch(opt){ case 'o': format = OCT; break; case 'x': format = HEX; break; case 'b': format = BIN; break; default: usage(argv[0]); } } if(optind >= argc){ scanf("%s", str); } else { strcpy(str, argv[optind]); } switch(format){ case HEX: num = htoi(str); break; case OCT: num = otoi(str); break; case BIN: num = btoi(str); break; default: num = -1; } if(num == -1){ fprintf(stderr, "Error: incorrectly formatted string %s\n", str); return EXIT_FAILURE; } printf("%d\n", num); return 0; }
Char myesc(Char *array) { Char c, esc_char; switch ( array[1] ) { case 'b': return '\b'; case 'f': return '\f'; case 'n': return '\n'; case 'r': return '\r'; case 't': return '\t'; #if __STDC__ case 'a': return '\a'; case 'v': return '\v'; #else case 'a': return '\007'; case 'v': return '\013'; #endif case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': { /* \<octal> */ int sptr = 1; while ( isascii( array[sptr] ) && isdigit( array[sptr] ) ) /* Don't increment inside loop control * because if isdigit() is a macro it might * expand into multiple increments ... */ ++sptr; c = array[sptr]; array[sptr] = '\0'; esc_char = otoi( array + 1 ); array[sptr] = c; return esc_char; } case 'x': { /* \x<hex> */ int sptr = 2; while ( isascii( array[sptr] ) && isxdigit( (char) array[sptr] ) ) /* Don't increment inside loop control * because if isdigit() is a macro it might * expand into multiple increments ... */ ++sptr; c = array[sptr]; array[sptr] = '\0'; esc_char = htoi( array + 2 ); array[sptr] = c; return esc_char; } default: return array[1]; } }
int main(int argc, char **argv) { int c; int c1, c2; (void) setlocale(LC_ALL, ""); #if !defined(TEXT_DOMAIN) /* Should be defined by cc -D */ #define TEXT_DOMAIN "SYS_TEST" /* Use this only if it weren't */ #endif (void) textdomain(TEXT_DOMAIN); while ((c = getopt(argc, argv, "ls")) != EOF) switch (c) { case 'l': lflg = 2; break; case 's': lflg = 0; break; case '?': default: narg(); } argv += optind; argc -= optind; if (argc < 2 || argc > 4) narg(); arg = argv[0]; if (arg[0] == '-' && arg[1] == 0) file1 = stdin; else if ((file1 = fopen(arg, "r")) == NULL) barg(); arg = argv[1]; if (arg[0] == '-' && arg[1] == 0) file2 = stdin; else if ((file2 = fopen(arg, "r")) == NULL) barg(); if (file1 == stdin && file2 == stdin) narg(); if (argc > 2) skip1 = otoi(argv[2]); if (argc > 3) skip2 = otoi(argv[3]); while (skip1) { if ((c1 = getc(file1)) == EOF) { arg = argv[0]; earg(); } skip1--; } while (skip2) { if ((c2 = getc(file2)) == EOF) { arg = argv[1]; earg(); } skip2--; } for (;;) { chr++; c1 = getc(file1); c2 = getc(file2); if (c1 == c2) { if (c1 == '\n') line++; if (c1 == EOF) { if (eflg) return (1); return (0); } continue; } if (lflg == 0) return (1); if (c1 == EOF) { arg = argv[0]; earg(); } if (c2 == EOF) earg(); if (lflg == 1) { (void) printf( gettext("%s %s differ: char %lld, line %lld\n"), argv[0], arg, chr, line); return (1); } eflg = 1; (void) printf("%6lld %3o %3o\n", chr, c1, c2); } }