DataMuseum.dk

Presents historical artifacts from the history of:

RegneCentralen RC700 "Piccolo"

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about RegneCentralen RC700 "Piccolo"

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦09760c593⟧ TextFile

    Length: 9216 (0x2400)
    Types: TextFile
    Names: »PRINTF.C«

Derivation

└─⟦4dd5d59b6⟧ Bits:30003303 Mix C version 2.1 og debugger til RC703
    └─ ⟦this⟧ »PRINTF.C« 
└─⟦b6190e06c⟧ Bits:30003304 Mix C version 2.1 til RC703
└─⟦b6190e06c⟧ Bits:30005327 Mix C version 2.1 til RC703
    └─ ⟦this⟧ »PRINTF.C« 

TextFile

#include "stdio"

printf(fs)                          /* standard routine */
char     *fs;
æ
    int     putc();
    int     _write();
    return _output(stdout, &fs, putc, _write);
å

fprintf(fp, fs)                     /* standard routine */
FILE     *fp;
char     *fs;
æ
    int     putc();
    int     _write();
    return _output(fp, &fs, putc, _write);
å

sprintf(s,fs)                       /* standard routine */
char    *s;
char    *fs;
æ
    int     _mputc();
    int     _mwrite();
    int     status;
    status = _output(&s, &fs, _mputc, _mwrite);
    *s = 'Ø0';
    return status;
å

_output(fp, parms, putc, write)     /* output routine for */
                                    /* printf, sprintf, fprintf */
char    *fp;                        /* pointer to destination */
char    **parms;                    /* pointer to addr of parameters */
int     (*putc)();                  /* pointer to output function */
int     (*write)();                 /* pointer to output function */
æ
    char    bufferÆ80Å;             /* encode buffer */
    char    *bufptr;                /* pointer into buffer */
    char    *format;                /* format string pointer */
    char    *cptr;                  /* pointer to character */
    char    c;                      /* current character */
    char    padchar;                /* pad character */
    int     ljflag;                 /* left justify flag */
    int     length;                 /* length of output string */
    int     precision;              /* precision for reals */
    int     flag;                   /* ftoa edit flag */
    int     left;                   /* number digits left of decimal */
    int     right;                  /* number digits right of decimal */
    int     width;                  /* mimimum field width */
    int     (*enc)();               /* pointer to encode function */
    int     _eint();                /* encode integer function */
    int     _elong();               /* encode long function */
    int     _edouble();             /* encode double function */
    int     _atoi();                /* convert string to integer */
    int     _getformat();           /* get format flag */
    int     strlen();               /* determine length of string */
    STRING  *dynamic;               /* dynamic string pointer */

    format = *parms--;              /* format points to format string */
    while (c = *format++) æ
        if (c != '%') æ
            if ((*putc)(c,fp) != EOF) continue;
            else return EOF;
        å
        precision = -1;
        bufptr = buffer;
        ljflag = 0;
        if (*format == '-') æ
            ++format;
            ++ljflag;
        å
        padchar = (*format == '0') ? '0' : ' ';
        width = (isdigit(*format)) ? _atoi(&format) : 0;
        if ((*format) == '.') æ
            ++format;
            if (isdigit(*format)) precision = _atoi(&format);
        å
        enc = _eint;
        if (toupper(c = *format++) == 'L') æ
            c = *format++;
            enc = _elong;
            --parms;
        å
        switch(toupper(c)) æ

            case 'D':                   /* signed decimal */
                    (*enc)(parms, buffer, 10, 1);
                    length = strlen(bufptr);
                    break;

            case 'U':                   /* unsigned decimal */
                    (*enc)(parms, buffer, 10, 0);
                    length = strlen(bufptr);
                    break;

            case 'O':                   /* unsigned octal */
                    (*enc)(parms, buffer, 8, 0);
                    length = strlen(bufptr);
                    break;

            case 'X':                   /* unsigned hexadecimal */
                    (*enc)(parms, buffer, 16, 0);
                    length = strlen(bufptr);
                    break;

            case 'S':                   /* string */
                    bufptr = *parms;
                    length = strlen(bufptr);
                    break;

            case 'C':                   /* character */
                    cptr = parms;
                    bufferÆ0Å = *cptr;
                    bufferÆ1Å = 'Ø0';
                    length = 1;
                    break;

            case 'E':                   /* exponential */
                    flag = 1;
                    goto reals;

            case 'F':                   /* fixed point */
                    flag = 0;
                    goto reals;

            case 'G':                   /* no trailing 0's */
                    /* fixed or exponential? */
                    flag = _getformat(parms-3);

               reals:
                    left = 1;
                    parms = parms - 3;
                    if (precision == -1) right = 6;
                    else right = precision;
                    _edouble(parms, buffer, flag, left, right);
                    precision = -1;
                    length = 0;
                    while (c=bufferÆlengthÅ) æ
                       if (c == 'D') bufferÆlengthÅ = 'E';
                       ++length;
                    å
                    break;

            case 'Y':                   /* dynamic string */
                    dynamic = *parms;
                    length = dynamic->length;
                    bufptr = dynamic->string;
                    break;

            default :                   /* format string character */
                    if ((*putc)(c, fp) != EOF) continue;
                    else return EOF;
        å
        if (precision >= 0 && length > precision) length = precision;
        width = width - length;
        if (!ljflag) æ
            if (padchar == '0' && *bufptr == '-') æ
                --length;
                if ((*putc)(*bufptr++, fp) == EOF) return EOF;
            å
            while (width-- > 0)
                if ((*putc)(padchar, fp) == EOF) return EOF;
        å
        if ((*write)(fp,bufptr,length) == EOF) return EOF;
        while (width-- > 0)
            if ((*putc)(padchar,fp) == EOF) return EOF;
        --parms;
    å
    return 0;
å

_eint(iptr, bufptr, base, sf)       /* encode an integer*/
int     *iptr;                      /* pointer to integer */
char    *bufptr;                    /* pointer to encode buffer */
int     base;                       /* number base */
int     sf;                         /* signed or unsigned flag */
æ
    if (*iptr < 0 && sf) æ
        *bufptr++ = '-';
        *iptr = -*iptr;
    å
    _itoa(*iptr, &bufptr, base);   /* convert integer to string */
    *bufptr = 'Ø0';
å

_elong(lptr, bufptr, base, sf)      /* encode a long */
long    *lptr;                      /* pointer to long */
char    *bufptr;                    /* pointer to encode buffer */
int     base;                       /* number base */
int     sf;                         /* sign flag */
æ
    if (*lptr < 0 && sf) æ
        *bufptr++ = '-';
        *lptr = -*lptr;
    å
    _ltostr(*lptr, &bufptr, base);  /* convert long to string */
    *bufptr = 'Ø0';
å

_itoa(n, bufptr, base)              /* integer encode routine */
unsigned    n;                      /* unsigned integer */
char        **bufptr;               /* pointer to the buffer pointer */
int         base;                   /* number base */
æ
    if (n < base) æ
        *(*bufptr)++ = (n < 10) ? n + 48 : n + 55;
        return;
    å
    _itoa(n/base, bufptr, base);
    _itoa(n%base, bufptr, base);
å

_ltostr(lptr, bufptr, base)         /* long encode routine */
long        lptr;                   /* long integer */
char        **bufptr;               /* pointer to the buffer pointer */
int         base;                   /* number base */
æ
    if (lptr < base) æ
        *(*bufptr)++ = (lptr < 10) ? lptr + '0' : lptr + 55;
        return;
    å
    _ltostr(lptr/base, bufptr, base);
    _ltostr(lptr%base, bufptr, base);
å

_edouble(dptr, bufptr, flag, left, right) /* encode a double */
double  *dptr;                            /* pointer to double */
char    *bufptr;                          /* pointer to encode buffer */
int     flag;                             /* encode format flag */
int     left;                             /* # of digits left of decimal */
int     right;                            /* # of digits right of decimal */
æ
    ftoa(*dptr, bufptr, flag, left, right);
å

_mputc(c, fp)                             /* write c to fp */
int     c;
char    **fp;
æ
   *(*fp)++ = c;
   return c;
å

_mwrite(fp, s, n)
char    **fp;
char    *s;
int     n;
æ
    int  i;
    for (i=0; i < n; i++) *(*fp)++ = *s++;
    return n;
å

_getformat(dptr)                        /* get format flag */
double  *dptr;                          /*  for _edouble   */
æ
   if (*dptr < 100000.0) return 2;     /* fixed format */
   else return 3;                      /* exponential format */
å

«eof»