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

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

unix.superglobalmegacorp.com

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