Annotation of 41BSD/cmd/px/35iosubs.s, revision 1.1.1.1

1.1       root        1: #
                      2: # Copyright (c) 1979 Regents of the University of California
                      3: #
                      4: # char sccsid[] = "@(#)35iosubs.s 4.2 10/16/80";
                      5: #
                      6: # IO SUBROUTINES
                      7: #
                      8:        .globl  _getname        #activate a file
                      9:        .globl  _unit           #establish active file
                     10:        .globl  _iosync         #syncronize a file window
                     11:        .globl  _unsync         #push backed synced record for formatted read
                     12:        .globl  _pflush         #flush all active files
                     13:        .globl  _pclose         #close selected files
                     14:        .globl  _pmflush        #flush pxp buffer
                     15: #
                     16: # system I/O routines
                     17: #
                     18:        .globl  _fclose
                     19:        .globl  _fflush
                     20:        .globl  _fopen
                     21:        .globl  _fprintf
                     22:        .globl  _fputc
                     23:        .globl  _fread
                     24:        .globl  _fscanf
                     25:        .globl  _fwrite
                     26:        .globl  _mktemp
                     27:        .globl  _rewind
                     28:        .globl  _setbuf
                     29:        .globl  _ungetc
                     30:        .globl  _unlink
                     31: #
                     32: # standard files
                     33: #
                     34: # file records
                     35: #
                     36:        .set    fnamesze,76             #maximum size of file name
                     37:        .set    recsze,30+fnamesze      #file record size
                     38:        .set    FNAME,-recsze           #name of associated UNIX file
                     39:        .set    LCOUNT,-30              #number of lines of output
                     40:        .set    LLIMIT,-26              #maximum number of text lines
                     41:        .set    FBUF,-22                #FILE pointer
                     42:        .set    FCHAIN,-18              #chain to next file
                     43:        .set    FLEV,-14                #ptr to associated file variable
                     44:        .set    PFNAME,-10              #ptr to name of error msg file
                     45:        .set    FUNIT,-6                #file status flags
                     46:        .set    FSIZE,-4                #size of elements in the file
                     47:        .set    WINDOW,0                #file window element
                     48: #
                     49: # unit flags
                     50: #
                     51:        .set    FDEF,0x8000     #1 => reserved file name
                     52:        .set    FTEXT,0x4000    #1 => text file, process EOLN
                     53:        .set    FWRITE,0x2000   #1 => open for writing
                     54:        .set    FREAD,0x1000    #1 => open for reading
                     55:        .set    TEMP,0x0800     #1 => temporary file
                     56:        .set    SYNC,0x0400     #1 => window is out of sync
                     57:        .set    EOLN,0x0200     #1 => at end of line
                     58:        .set    EOF,0x0100      #1 => at end of file
                     59: #
                     60: # bit positions of unit flags
                     61: #
                     62:        .set    fDEF,15
                     63:        .set    fTEXT,14
                     64:        .set    fWRITE,13
                     65:        .set    fREAD,12
                     66:        .set    fTEMP,11
                     67:        .set    fSYNC,10
                     68:        .set    fEOLN,9
                     69:        .set    fEOF,8
                     70: #
                     71: # standard file buffers
                     72: #
                     73:        .set    ioEOF,4         #bit position flagging EOF
                     74:        .set    ioERR,5         #bit position flagging I/O error
                     75:        .set    FLAG,12         #record offset of error flag
                     76: #
                     77: # standard input file
                     78: #
                     79:        .data
                     80:        .space  fnamesze        #name of associated UNIX file
                     81:        .long   0               #line count
                     82:        .long   0               #line limit
                     83:        .long   __iob           #FILE pointer
                     84:        .long   stdout          #chain to next file
                     85:        .long   0               #ptr to associated file variable
                     86:        .long   sinnam          #ptr to name of error msg file
                     87:        .word   FTEXT+FREAD+SYNC  #file status flags
                     88:        .long   1               #size of elements in the file
                     89: stdin:
                     90:        .word   0               #file window element
                     91: #
                     92: # standard output file
                     93: #
                     94:        .space  fnamesze        #name of associated UNIX file
                     95:        .long   0               #line count
                     96:        .long   0               #line limit
                     97:        .long   __iob+16        #FILE pointer
                     98:        .long   stderr          #chain to next file
                     99:        .long   0               #ptr to associated file variable
                    100:        .long   soutnam         #ptr to name of error msg file
                    101:        .word   FTEXT+FWRITE+EOF  #file status flags
                    102:        .long   1               #size of elements in the file
                    103: stdout:
                    104:        .word   0               #file window element
                    105: #
                    106: # standard error file
                    107: #
                    108:        .space  fnamesze        #name of associated UNIX file
                    109:        .long   0               #line count
                    110:        .long   0               #line limit
                    111:        .long   __iob+32        #FILE pointer
                    112:        .long   0               #chain to next file
                    113:        .long   0               #ptr to associated file variable
                    114:        .long   msgnam          #ptr to name of error msg file
                    115:        .word   FTEXT+FWRITE    #file status flags
                    116:        .long   1               #size of elements in the file
                    117: stderr:
                    118:        .word   0               #file window element
                    119: 
                    120: tmpname:.byte  't,'m,'p,'.,'X,'X,'X,'X,'X,'X, 0
                    121:        .text
                    122: sinnam:        .byte   's,'t,'a,'n,'d,'a,'r,'d,' ,'i,'n,'p,'u,'t, 0
                    123: soutnam:.byte  's,'t,'a,'n,'d,'a,'r,'d,' ,'o,'u,'t,'p,'u,'t, 0
                    124: msgnam:        .byte   'M,'e,'s,'s,'a,'g,'e,' ,'f,'i,'l,'e, 0
                    125: monout:        .byte   'p,'m,'o,'n,'.,'o,'u,'t, 0
                    126: rdopen:        .byte   'r, 0
                    127: wtopen:        .byte   'w, 0
                    128:        .set    formfeed,12
                    129:        .set    linefeed,10
                    130:        .set    blank,' 
                    131: #
                    132: # getname
                    133: #
                    134: # takes the width of a string in the subopcode and
                    135: # returns a pointer to a file structure in r0
                    136: #
                    137: # there should be a string on the stack
                    138: # of length the contents of subopcode on top of
                    139: # a pointer to the file variable
                    140: #
                    141: # a new file structure is allocated if needed
                    142: # temporary names are generated, and given
                    143: # names are blank trimmed
                    144: #
                    145: # if a new file buffer is allocated, the address
                    146: # is stored in the file variable.
                    147: #
                    148: #
                    149: _getname: #(datasze, maxnamlen, name, fileptr)
                    150: #int           datasze;
                    151: #int           maxnamlen;
                    152: #char          *name;
                    153: #struct file   **fileptr;
                    154: 
                    155:        .word   R6|R7|R8|R9
                    156:        movl    4(ap),r6        #r6 has data size
                    157:        movl    12(ap), r8      # r8 points to file name
                    158:        movl    16(ap), r9      # r9 pts to file variable
                    159:        tstl    ( r9)           #check for existing file record
                    160:        bneq    gotone
                    161: #
                    162: # allocate and initialize a new file record
                    163: #
                    164:        clrl     r7             # r7 has status flags
                    165:        tstl    r6              #check for size
                    166:        bneq    l3502
                    167:        movw    $FTEXT, r7      #default to text file
                    168:        movl    $1,r6           #default size
                    169: l3502:
                    170:        addl3   $recsze,r6,-(sp)#size of record
                    171:        calls   $1,_palloc      #r0 points to allocated buffer
                    172:        addl2   $recsze,r0      #adjust to base of record
                    173:        clrl    LCOUNT(r0)      #set default line limits
                    174:        movl    _llimit,LLIMIT(r0)
                    175:        movw     r7,FUNIT(r0)   #set flags
                    176:        movl    r6,FSIZE(r0)    #set size
                    177:        movl     r9,FLEV(r0)    #set ptr to file variable
                    178:        movl    r0,( r9)        #set file var ptr
                    179: #
                    180: # link the new record into the file chain
                    181: #
                    182:        movl    $_fchain-FCHAIN,r6   #r6 pts to "previous" record
                    183:        movl    _fchain,r1      #r1 pts to "next" record
                    184:        brb     l3505
                    185: l3504:
                    186:        movl    r1,r6           #advance previous
                    187:        movl    FCHAIN(r1),r1   #get next
                    188: l3505:
                    189:        cmpl    FLEV(r1), r9    #check level
                    190:        blssu   l3504           #continue until greater
                    191: 
                    192:        movl    r1,FCHAIN(r0)   #link in new record
                    193:        movl    r0,FCHAIN(r6)
                    194: 
                    195:        movl    r0, r9          # r9 points to file record
                    196:        jbr     setname
                    197: #
                    198: # have a previous buffer, dispose of associated file
                    199: #
                    200: gotone:
                    201:        movl    ( r9), r9                  # r9 points to file record
                    202:        bicw2   $~(FDEF+TEMP+FTEXT),FUNIT( r9)  #clear status flags
                    203:        bbc     $fDEF,FUNIT( r9),l3506     #check for predefined file
                    204:        bicw2   $FDEF,FUNIT( r9)           #clear predefined flag
                    205:        jbr     setname
                    206: l3506:
                    207:        pushl   FBUF( r9)                 #flush and close previous file
                    208:        calls   $1,_fclose
                    209:        movl    FBUF( r9),r0
                    210:        bbs     $ioERR,FLAG(r0),eclose
                    211:        bbc     $fTEMP,FUNIT( r9),setname #check for temp file
                    212:        tstl     r8                       #remove renamed temp files
                    213:        beql    setname
                    214:        pushl   PFNAME( r9)
                    215:        calls   $1,_unlink
                    216:        tstl    r0              #check for remove error
                    217:        beql    setname
                    218: eunlink:
                    219:        movl    PFNAME( r9),_file
                    220:        movw    $EREMOVE,_perrno
                    221:        moval   error,PC(fp)    #error return
                    222:        ret
                    223: eclose:
                    224:        movl    PFNAME( r9),_file
                    225:        movw    $ECLOSE,_perrno
                    226:        moval   error,PC(fp)    #error return
                    227:        ret
                    228: #
                    229: # get the filename associated with the buffer
                    230: #
                    231: setname:
                    232:        tstl     r8             #check for a given name
                    233:        bneq    l3508           #br => has a name
                    234:        tstb    FNAME( r9)      #check for no current name
                    235:        bneq    l3513           #br => had a previous name so use it
                    236: #
                    237: # no name given and no previous name, so generate
                    238: # a new one of the form tmp.xxxxxx
                    239: #
                    240:        bisw2   $TEMP,FUNIT( r9)#set status to temporary
                    241:        pushal  tmpname         #get a unique temp name
                    242:        calls   $1,_mktemp
                    243:        movl    r0, r8          #ptr to new temp name
                    244:        movl    $16,r2          #maximum name length
                    245:        brb     l3512
                    246: #
                    247: # put the new name into the structure
                    248: #
                    249: l3508:
                    250:        bicw2   $TEMP,FUNIT( r9)        #set permanent status
                    251:        locc    $blank,8(ap),( r8)      #check for trailing blanks
                    252:        subl3   r0,8(ap),r2             #deduct length of blanks
                    253:        cmpl    r2,$fnamesze            #check for name too long
                    254:        bgeq    enamsze
                    255: l3512:
                    256:        movc3   r2,( r8),FNAME( r9)     #move name into record
                    257:        clrb    (r3)                    #place zero after name
                    258:        moval   FNAME( r9),PFNAME( r9)  #set pointer to name
                    259: l3513:
                    260:        movl     r9,r0                  #return ptr to file record
                    261:        ret
                    262: enamsze:
                    263:        movw    $ENAMESIZE,_perrno
                    264:        moval   error,PC(fp)            #error return
                    265:        ret
                    266: #
                    267: # unit establishes a new active file
                    268: #
                    269: _unit:
                    270:        .word   0
                    271:        movl    4(ap),r7
                    272:        beql    erefinaf
                    273:        bbs     $fDEF,FUNIT(r7),erefinaf
                    274:        movl    PFNAME(r7),_file
                    275:        ret
                    276: erefinaf:
                    277:        movw    $EREFINAF,_perrno
                    278:        moval   error,PC(fp)    #error return
                    279:        ret
                    280: #
                    281: # iosync insures that a useable image is in the buffer window
                    282: #
                    283: _iosync:
                    284:        .word   R6
                    285:        cvtwl   FUNIT(r7),r6    #r6 has FUNIT flags
                    286:        bbc     $fREAD,r6,eread #error if not open for reading
                    287:        bbc     $fSYNC,r6,l3515 #check for already synced
                    288:        bbs     $fEOF,r6,epeof  #error if past EOF
                    289:        bicw2   $SYNC,r6        #clear unsynced flag
                    290:        pushl   FBUF(r7)        #stream
                    291:        pushl   $1              #number of items to read
                    292:        pushl   FSIZE(r7)       #data size
                    293:        pushl   r7              #ptr to input window
                    294:        calls   $4,_fread
                    295:        movl    FBUF(r7),r0     #check for EOF
                    296:        bbs     $ioERR,FLAG(r0),epeof
                    297:        bbs     $ioEOF,FLAG(r0),eof
                    298:        bbc     $fTEXT,r6,l3514 #check for text processing
                    299:        bicw2   $EOLN,r6        #check for EOLN
                    300:        cmpb    (r7),$linefeed
                    301:        bneq    l3514
                    302:        movb    $blank,(r7)     #blank out linefeed
                    303:        bisw2   $EOLN,r6
                    304: l3514:
                    305:        movw    r6,FUNIT(r7)    #update status flags
                    306: l3515:
                    307:        ret
                    308: eof:
                    309:        bisw2   $EOF,r6         #set EOF
                    310:        movw    r6,FUNIT(r7)    #update status flags
                    311:        pushr   $R2|R3|R4|R5    #save registers
                    312:        movc5   $0,(r0),$0,FSIZE(r7),(r7)  #clear buffer to undefined
                    313:        popr    $R2|R3|R4|R5    #restore registers
                    314:        ret
                    315: eread:
                    316:        movw    $EREADIT,_perrno
                    317:        moval   error,PC(fp)    #error return
                    318:        ret
                    319: epeof:
                    320:        movw    $EPASTEOF,_perrno
                    321:        moval   error,PC(fp)    #error return
                    322:        ret
                    323: #
                    324: # push back last char read to prepare for formatted read
                    325: #
                    326: _unsync:
                    327:        .word   0
                    328:        bbc     $fREAD,FUNIT(r7),eread  #error if not open for reading
                    329:        bbs     $fSYNC,FUNIT(r7),l3526  #push back window char
                    330:        pushl   FBUF(r7)
                    331:        cvtbl   (r7),-(sp)
                    332:        calls   $2,_ungetc
                    333: l3526:
                    334:        ret
                    335: #
                    336: # flush all active output files
                    337: #
                    338: _pflush:
                    339:        .word   R6
                    340:        movl    _fchain,r6
                    341:        beql    l3518
                    342: l3516:
                    343:        bbc     $fWRITE,FUNIT(r6),l3517
                    344:        pushl   FBUF(r6)
                    345:        calls   $1,_fflush
                    346: l3517:
                    347:        movl    FCHAIN(r6),r6
                    348:        bneq    l3516
                    349: l3518:
                    350:        ret
                    351: #
                    352: # close all active files down to the specified FLEV
                    353: #
                    354: _pclose:
                    355:        .word   R6|R9
                    356:        movl    _fchain, r9
                    357:        beql    l3520
                    358: l3519:
                    359:        cmpl    FLEV( r9),4(ap)
                    360:        bgtru   l3520
                    361:        bbs     $fDEF,FUNIT( r9),l3525
                    362:        movl    FBUF( r9),r6
                    363:        beql    l3525
                    364:        pushl   r6
                    365:        calls   $1,_fclose
                    366:        jbs     $ioERR,FLAG(r6),eclose
                    367:        bbc     $fTEMP,FUNIT( r9),l3525
                    368:        pushl   PFNAME( r9)             #remove TEMP files
                    369:        calls   $1,_unlink
                    370:        tstl    r0
                    371:        jneq    eunlink
                    372: l3525:
                    373:        subl3   $recsze, r9,-(sp)
                    374:        movl    FCHAIN( r9), r9
                    375:        calls   $1,_pfree
                    376:        tstl     r9
                    377:        bneq    l3519
                    378: l3520:
                    379:        movl    r9,_fchain
                    380:        ret
                    381: #
                    382: # write out the pxp data
                    383: #
                    384: _pmflush:
                    385:        .word   R6
                    386:        tstl    _pxpbuf
                    387:        beql    l3521
                    388:        pushal  wtopen
                    389:        pushal  monout
                    390:        calls   $2,_fopen
                    391:        tstl    r0
                    392:        beql    l3522
                    393:        movl    r0,r6
                    394:        pushl   r6
                    395:        pushl   $1
                    396:        pushl   _pxpsize
                    397:        pushl   _pxpbuf
                    398:        calls   $4,_fwrite
                    399:        bbs     $ioERR,FLAG(r6),l3522
                    400:        pushl   r6
                    401:        calls   $1,_fclose
                    402:        bbs     $ioERR,FLAG(r6),l3522
                    403: l3521:
                    404:        ret
                    405: l3522:
                    406:        pushal  monout
                    407:        calls   $1,_perror
                    408:        ret

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.