Annotation of 3BSD/cmd/px/35iosubs.s, revision 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.