Path: utzoo!attcan!uunet!nems!mimsy!mojo!mojo!djm From: djm@eng.umd.edu (David J. MacKenzie) Newsgroups: alt.sources Subject: conv.c -- simple numeric base converter Message-ID: Date: 2 Jul 90 21:02:12 GMT Sender: news@eng.umd.edu (The News System) Organization: Free Software Foundation Lines: 134 /* conv - convert numbers between bases Usage: conv [-dho] number... Print the value of each given NUMBER in the output base selected by the options. Options: -d Output in decimal. -h Output in hexadecimal. -o Output in octal. Non-option arguments are taken to be numbers in one of the three bases. Hex numbers start with 0x; octal numbers start with 0; all other arguments are assumed to be decimal numbers. David MacKenzie Public domain. Latest revision: 07/02/90 */ #include long convert (); void invalid_num (); void output (); /* The name this program was run with. */ char *program_name; void main (argc, argv) int argc; char **argv; { extern int optind; int optc; int output_base; program_name = argv[0]; output_base = 0; while ((optc = getopt (argc, argv, "dho")) != EOF) { switch (optc) { case 'd': output_base = 10; break; case 'h': output_base = 16; break; case 'o': output_base = 8; break; default: output_base = 0; goto usage; } } usage: if (optind == argc || output_base == 0) { fprintf (stderr, "\ Usage: %s [-dho] [0xhexnum] [0octnum] [decnum] ...\n", argv[0]); exit (1); } for (; optind < argc; ++optind) output (convert (argv[optind]), output_base); putchar ('\n'); exit (0); } long convert (anumber) char *anumber; { long number; if (anumber[0] == '0' && anumber[1] == 'x') { /* Convert from hex; sscanf returns number of conversions performed. */ if (anumber[2] == '\0' || sscanf (anumber + 2, "%lx", &number) == 0) invalid_num (anumber); } else if (anumber[0] == '0') { /* Convert from octal. */ if (anumber[1] == '\0') number = 0L; else if (sscanf (anumber + 1, "%lo", &number) == 0) invalid_num (anumber); } else { /* Convert from decimal. */ if (anumber[0] == '\0' || sscanf (anumber, "%ld", &number) == 0) invalid_num (anumber); } return number; } void output (number, base) long number; int base; { switch (base) { case 10: printf ("%ld ", number); break; case 8: printf ("0%lo ", number); break; case 16: printf ("0x%lx ", number); break; } } void invalid_num (anumber) char *anumber; { fprintf (stderr, "%s: %s: invalid number\n", program_name, anumber); exit (1); } -- David J. MacKenzie