home *** CD-ROM | disk | FTP | other *** search
- From: jef@well.sf.ca.us (Jef Poskanzer)
- Newsgroups: alt.sources
- Subject: Re: conv.c -- simple numeric base converter
- Message-ID: <18852@well.sf.ca.us>
- Date: 3 Jul 90 15:05:12 GMT
-
- For such a simple interface, a script front-ending for bc would
- work too. For a somewhat more interesting interface, see below.
- It's a base-conversion filter -- looks for any numbers in stdin,
- converts them from any base to any base in [2..36], and leaves
- non-numeric text alone.
- ---
- Jef
-
- Jef Poskanzer jef@well.sf.ca.us {ucbvax, apple, hplabs}!well!jef
- "Publish and be damned." -- Wellesley, Duke of Wellington
-
- /*
- ** baseconvert.c - base conversion filter
- **
- ** Copyright (C) 1989 by Jef Poskanzer.
- **
- ** Permission to use, copy, modify, and distribute this software and its
- ** documentation for any purpose and without fee is hereby granted, provided
- ** that the above copyright notice appear in all copies and that both that
- ** copyright notice and this permission notice appear in supporting
- ** documentation. This software is provided "as is" without express or
- ** implied warranty.
- */
-
- #include <stdio.h>
- #include <strings.h>
- #include <ctype.h>
-
- static char *idigits = "0123456789abcdefghijklmnopqrstuvwxyz";
- static char *odigits = "0123456789abcdefghijklmnopqrstuvwxyz";
-
- main( argc, argv )
- int argc;
- char *argv[];
- {
- int ibase, obase;
- char *usage = "usage: %s <ibase> <obase>\n";
- int ic, i, gettingi, digit;
- char c, lc;
- char *digitp;
- void putint( );
-
- if ( argc != 3 ||
- ( ibase = atoi( argv[1] ) ) < 2 || ibase > 36 ||
- ( obase = atoi( argv[2] ) ) < 2 || obase > 36 )
- {
- fprintf( stderr, usage, argv[0] );
- exit( 1 );
- }
- idigits[ibase] = '\0';
-
- gettingi = 0;
- for ( ; ; )
- {
- ic = getchar( );
- if ( ic == EOF ) break;
- c = ic;
- if ( isupper( c ) )
- lc = tolower( c );
- else
- lc = c;
- digitp = index( idigits, lc );
- if ( digitp == (char *) 0 )
- {
- if ( gettingi )
- {
- putint( i, obase );
- gettingi = 0;
- }
- putchar( c );
- }
- else
- {
- digit = digitp - idigits;
- if ( gettingi )
- {
- i = i * ibase + digit;
- }
- else
- {
- gettingi = 1;
- i = digit;
- }
- }
- }
-
- if ( gettingi )
- putint( i, obase );
-
- exit( 0 );
- }
-
- void
- putint( i, base )
- int i, base;
- {
- if ( i >= base )
- putint( i / base, base );
- putchar( odigits[i % base] );
- }
-