#define rsts 1 #include #include #define BUFSIZ 512 static FILE fakfp$; static char fak_buf[BUFSIZ]; printf(control, args) char *control; { if (stdout->io_flag & IO_REC) { zero(&fakfp$, sizeof(FILE)); fakfp$.io_bptr = fakfp$.io_bbuf = fak_buf; fakfp$.io_bsiz = BUFSIZ; $doprn(control, &args, &fakfp$); putc('\0', &fakfp$); $write(stdout, fakfp$.io_bbuf, strlen(fakfp$.io_bbuf),stdout->io_recm); } else { $doprn(control, &args, stdout); } } fprintf(fp, control, args) FILE *fp; char *control; { if (fp->io_flag & IO_REC) { zero(&fakfp$, sizeof(FILE)); fakfp$.io_bptr = fakfp$.io_bbuf = fak_buf; fakfp$.io_bsiz = BUFSIZ; $doprn(control, &args, &fakfp$); putc('\0', &fakfp$); $write(fp, fakfp$.io_bbuf, strlen(fakfp$.io_bbuf),fp->io_recm); } else { $doprn(control, &args, fp); } } sprintf(buffer, control, args) char *buffer; char *control; { zero(&fakfp$, sizeof(FILE)); fakfp$.io_bptr = fakfp$.io_bbuf = buffer; fakfp$.io_bsiz = 32767; $doprn(control, &args, &fakfp$); putc('\0', &fakfp$); return(buffer); } $doprn(control, pargs, $fp) char *control; int *pargs; FILE *$fp; { char c, *ps, rjust, s[17], zrofil; int k, prec, slen, width; char *nbase(), *nspoct(); while( c = *control++ ){ /* Check for conversion specifications. */ if( c == '%' ){ /* Check for various options. */ if( (c = *control) == '-' ){ rjust = 0; c = *control++; } else { rjust = 1; } zrofil = (c == '0'); if( *control == '?' ){ width = *pargs++; c = *(++control); ++control; } else { width = 0; while( isdigit( c = tolower(*control++)) ){ width = 10*width + c - '0'; } } if( c == '.' ){ if( *control == '?' ){ prec = *pargs++; c = *(++control); ++control; } else { prec = 0; while( isdigit( c = tolower(*control++)) ){ prec = 10*prec + c - '0'; } } } else prec = 32767; /* Process conversion chars. */ switch(c){ case ('b'): ps = nbase(*pargs++, 2, s); break; case ('o'): ps = nbase(*pargs++, 8, s); break; case ('d'): if( *pargs < 0 ){ ps = nbase(-*pargs++, 10, s); *--ps = '-'; } else ps = nbase(*pargs++, 10, s); break; case ('u'): ps = nbase(*pargs++, 10, s); break; case ('x'): ps = nbase(*pargs++, 16, s); break; case ('q'): ps = nspoct(*pargs++, s); break; case ('s'): ps = *pargs++; break; case ('c'): c = *pargs++; /* fall thru */ default: *(ps = s) = c; s[1] = EOS; } k = strlen(ps); slen = (k > prec) ? prec : k; if( rjust ){ while( width -- > slen ){ putc(zrofil? '0' : ' ', $fp); } } for( k = 1; *ps && k <= prec; ++k ){ putc(*ps++, $fp); } if( !rjust ){ while( width -- > slen ){ putc(' ', $fp); } } } else putc(c, $fp); } return; } char *nbase(n, base, s) unsigned n, base; char *s; { int d; *(s += 16) = EOS; if( n == 0 ) *--s = '0'; else { while( n > 0 ){ d = n % base; *--s = d + (d < 10 ? '0' : 55); n /= base; } } return (s); } char *nspoct(n, s) unsigned n; char s[]; { int d; char *ps; d = 16384; ps = s; while( d > 0 ){ *ps++ = n/d + '0'; n %= d; if( d == 256 ){ d = 64; *ps++ = '.'; } else d /= 8; } *ps = EOS; return (s); } $write(fp, buffer, buflen, modifier) FILE *fp; char *buffer; int buflen; int modifier; { clrxrb(); xrb.xrlen = buflen; /* Buffer length */ xrb.xrbc = buflen; /* Number of bytes to write */ xrb.xrloc = buffer; /* Buffer start */ xrb.xrci = fp->io_lun * 2; /* Channel number */ xrb.xrmod = modifier; /* Device (record) modifier */ $$ferr = rstsys(_WRITE); }