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 #include #include static char *idigits = "0123456789abcdefghijklmnopqrstuvwxyz"; static char *odigits = "0123456789abcdefghijklmnopqrstuvwxyz"; main( argc, argv ) int argc; char *argv[]; { int ibase, obase; char *usage = "usage: %s \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] ); }