Annotation of os2sdk/demos/apps/cpgrep/cpgrepsb.asm, revision 1.1.1.1

1.1       root        1: name cpgrepsub
                      2: 
                      3: retlen equ     2                       ; Size of return address on stack
                      4: 
                      5: dgroup group   _data
                      6: 
                      7: extrn  _casesen:       word            ; Case-sensitivity flag
                      8: extrn  _stringlist:    word            ; Table of string lists
                      9: extrn  _target:        byte            ; Target string
                     10: extrn  _targetlen:     word            ; Length of target string
                     11: extrn  _transtab:      byte            ; Translation table for _findlist
                     12: 
                     13: ;      This segment is puposely word-aligned.  See note
                     14: ;      in _findlist below.
                     15: 
                     16: _text  segment word public 'code'
                     17:        assume  cs:_text, ds:dgroup, es:nothing, ss:dgroup
                     18: 
                     19: ; char                 *findone(buffer,bufend)
                     20: ; char                 *buffer         /* Buffer in which to search */
                     21: ; char                 *bufend;        /* End of buffer */
                     22: ;
                     23: ; NOTE: targetlen MUST BE greater than zero
                     24: 
                     25: buffer equ     word ptr [bp+retlen+2]
                     26: bufend equ     word ptr [bp+retlen+4]
                     27: 
                     28:        EVEN
                     29: 
                     30:        public  _findone
                     31: _findone proc  near
                     32:        push    bp
                     33:        mov     bp,sp
                     34:        push    di
                     35:        push    si
                     36:        push    es
                     37:        push    ds                      ; ES = DS
                     38:        pop     es
                     39:        mov     cx,bufend               ; CX = end of buffer
                     40:        mov     di,buffer               ; ES:DI = buffer
                     41:        sub     cx,di                   ; CX = length of buffer
                     42:        jbe     sfnomatch               ;  length less than or equal to zero
                     43:        mov     dx,_targetlen           ; DX = length of target
                     44:        dec     dx                      ; Decrement it
                     45:        sub     cx,dx                   ; target must fit in buffer
                     46:        jbe     sfnomatch               ;  (no match if buffer too short)
                     47: 
                     48: ;      CX = buffer length
                     49: ;      DX = target length (minus first character)
                     50: ;      ES:DI = buffer pointer
                     51: 
                     52: sf0:   jcxz    sfnomatch               ; No match if count zero
                     53:        mov     si,offset dgroup:_target ; DS:SI = target
                     54:        lodsb                           ; AL = first byte of target
                     55:        repne scasb                     ; Look for first character
                     56:        jne     sfnomatch               ;  jump if not found
                     57:        mov     bx,cx                   ; BX = buffer length
                     58:        mov     ax,di                   ; AX = buffer pointer
                     59:        mov     cx,dx                   ; Get count for cmpsb
                     60:        or      cx,cx                   ; Zero? (JCXZ doesn't set flag)
                     61:        je      sf1                     ;  yes, skip compare
                     62:        repe cmpsb                      ; Do string compare
                     63: sf1:   mov     di,ax                   ; DI = buffer pointer
                     64:        mov     cx,bx                   ; CX = buffer length
                     65:        jne     sf0                     ; Loop if no match
                     66:        dec     ax                      ; AX = offset of start of match
                     67:        jmp     short sf4
                     68: 
                     69: sfnomatch:
                     70:        xor     ax,ax                   ; No match
                     71: sf4:   pop     es
                     72:        pop     si
                     73:        pop     di
                     74:        pop     bp
                     75:        ret
                     76: _findone endp
                     77: 
                     78: 
                     79: ; int                  revfind(s,c,slen)
                     80: ; char                 *s;             /* String to search */
                     81: ; int                  c;              /* Char to search for */
                     82: ; int                  slen;           /* Length of s */
                     83: 
                     84: s      equ     [bp+retlen+2]
                     85: c      equ     [bp+retlen+4]
                     86: slen   equ     [bp+retlen+6]
                     87: 
                     88:        EVEN
                     89: 
                     90:        public  _revfind
                     91: _revfind proc  near
                     92:        push    bp
                     93:        mov     bp,sp
                     94:        push    di
                     95:        push    es
                     96:        push    ds
                     97:        pop     es
                     98:        mov     di,s
                     99:        mov     ax,c
                    100:        mov     cx,slen
                    101:        jcxz    rf1
                    102:        std
                    103:        repne scasb
                    104:        cld
                    105:        mov     cx,s
                    106:        jne     rf0
                    107:        inc     di
                    108: rf0:   sub     cx,di
                    109: rf1:   mov     ax,cx
                    110:        pop     es
                    111:        pop     di
                    112:        pop     bp
                    113:        ret
                    114: _revfind endp
                    115: 
                    116: 
                    117: ; int                  countlines(start,finish)
                    118: ; char                 *start;
                    119: ; char                 *finish;
                    120: 
                    121: start  equ     [bp+retlen+2]
                    122: finish equ     [bp+retlen+4]
                    123: 
                    124:        EVEN
                    125: 
                    126:        public  _countlines
                    127: _countlines proc near
                    128:        push    bp
                    129:        mov     bp,sp
                    130:        push    di
                    131:        push    es
                    132:        push    ds
                    133:        pop     es
                    134:        xor     dx,dx                   ; Accumulate count in DX
                    135:        mov     di,start                ; ES:DI points to start
                    136:        mov     cx,finish               ; Put length in CX
                    137:        sub     cx,di
                    138:        jbe     cl1                     ;  branch if no bytes
                    139:        mov     al,0Ah                  ; Search for linefeeds
                    140: cl0:   jcxz    cl1                     ; Exit loop if count zero
                    141:        repne scasb                     ; Do search
                    142:        jne     cl1                     ;  branch if none found
                    143:        inc     dx                      ; Increment count
                    144:        jmp     short cl0               ; Loop
                    145: cl1:   mov     ax,dx                   ; Return line count in AX
                    146:        pop     es
                    147:        pop     di
                    148:        pop     bp
                    149:        ret
                    150: _countlines endp
                    151: 
                    152: 
                    153: ; char                 *findlist(buffer,bufend)
                    154: ; char                 *buffer;        /* Buffer to search */
                    155: ; char                 *bufend;        /* End of buffer */
                    156: 
                    157: savesi equ     word ptr [bp-2]
                    158: endbyte        equ     byte ptr [bp-4]
                    159: 
                    160: stringnode struc
                    161:        s_alt   dw      ?               ; List of alternate portions
                    162:        s_suf   dw      ?               ; Pointer to suffix string list
                    163:        s_must  dw      ?               ; Length of portion that must match
                    164: stringnode ends
                    165: 
                    166:        EVEN
                    167: 
                    168: flworker dw    findsubi, findsub       ; Worker dispatch table
                    169: 
                    170:        public  _findlist
                    171: _findlist proc near
                    172:        ASSUME  DS:DGROUP, ES:NOTHING, SS:DGROUP
                    173: 
                    174:        push    bp
                    175:        mov     bp,sp
                    176:        sub     sp,4                    ; Make room for local vars
                    177:        push    di
                    178:        push    si
                    179:        push    ds
                    180:        pop     es
                    181:     ASSUME     ES:DGROUP
                    182: 
                    183: ;      We mark the end of our search buffer with 0FFh so that
                    184: ;      any comparisons that might run past the end of the buffer
                    185: ;      will fail on the 0FFh.  We choose 0FFh so that if the
                    186: ;      comparison fails on it, it will always appear as though
                    187: ;      the string in the buffer is greater that the string in
                    188: ;      the search list.  This will prevent us from stopping
                    189: ;      the search too soon.  Of course, we must restore the byte
                    190: ;      when we're done.
                    191: 
                    192:        mov     bx,bufend               ; BX = end of buffer
                    193:        mov     al,0FFh                 ; End marker
                    194:        xchg    byte ptr [bx],al        ; AL = byte after end of buffer
                    195:        mov     endbyte,al              ; Save the byte
                    196: 
                    197:        mov     cx,bx                   ; CX = end of buffer
                    198:        mov     si,buffer               ; SI = buffer
                    199:        sub     cx,si                   ; CX = buffer length
                    200:        jbe     fl1                     ;  no match if empty buffer
                    201:        mov     bx,offset dgroup:_transtab ; BX = translation table address
                    202: 
                    203:        mov     di,_casesen             ; Get flag
                    204:        shl     di,1                    ; Scale to word index
                    205:        call    cs:flworker[di]         ; Call helper
                    206:        jc      fl1                     ;  branch if no match
                    207: 
                    208: ;      We have a match
                    209: ;
                    210: ;      SI = offset of first character past end of matched string
                    211: ;      savesi = offset of first character past start of matched string
                    212: 
                    213:        mov     ax,savesi               ; AX = 1st char past start
                    214:        dec     ax                      ; AX = start of matched string
                    215:        jmp     short fl2
                    216: 
                    217: ;      We did not find a match
                    218: 
                    219: fl1:
                    220:        xor     ax,ax                   ; Return NULL
                    221: 
                    222: ;      Restore end byte before leaving
                    223: 
                    224: fl2:
                    225:        mov     bx,bufend               ; BX = end of buffer
                    226:        mov     dl,endbyte              ; DL = end byte
                    227:        mov     [bx],dl                 ; Restore byte
                    228: 
                    229:        pop     si
                    230:        pop     di
                    231:        mov     sp,bp
                    232:        pop     bp
                    233:        ret
                    234: 
                    235: _findlist endp
                    236: 
                    237: 
                    238: ;***   findsub - case-sensitive worker for _findlist
                    239: ;
                    240: ;      This function does most of the work for
                    241: ;      case-sensitive multi-string searches.
                    242: ;
                    243: ;      ENTRY   BX = address of translation table
                    244: ;              CX = number of bytes left in buffer
                    245: ;              DS:SI = buffer pointer
                    246: ;              SS:BP = pointer to stack frame for _findlist
                    247: ;      EXIT    Carry set
                    248: ;                  No match
                    249: ;              Carry clear
                    250: ;                  DS:SI = pointer to first character after match
                    251: ;      USES    AX, CX, DX, DI, SI, Flags
                    252: 
                    253:        EVEN
                    254: 
                    255:        public  findsub, fs0, fs1, fs2, fs3, fs4, fs5, fs6
                    256: findsub        proc    near
                    257:        ASSUME  DS:DGROUP, ES:DGROUP, SS:DGROUP
                    258: 
                    259: fs0:
                    260:        xor     ax,ax                   ; AH = 0
                    261: 
                    262: ;      AH = 0
                    263: ;      BX = address of translation table
                    264: ;      CX = number of bytes left in buffer
                    265: ;      SI = buffer pointer
                    266: ;      DS = ES = SS = DGROUP
                    267: 
                    268: fs1:
                    269:        lodsb                           ; Character in AL
                    270:        xlat byte ptr [bx]              ; Translate character to index
                    271:        or      al,al                   ; Zero means invalid 1st byte
                    272:        loopz   fs1                     ;  if so, try next character
                    273: 
                    274: ;      Either the zero bit is set, meaning the buffer is empty,
                    275: ;      or the zero bit is clear, meaning we have a valid first
                    276: ;      character.  Either way, CX has been decremented.
                    277: 
                    278:        jz      fs6                     ;  branch if buffer empty
                    279:        mov     savesi,si               ; Save buffer pointer
                    280:        shl     ax,1                    ; Scale to word index
                    281:        mov     di,ax
                    282:        mov     di,_stringlist[di]      ; DI points to string record
                    283:        or      di,di                   ; One byte match? (OR clears carry)
                    284:        jz      fs3                     ;  yes, skip ahead
                    285: 
                    286: ;      Loop to search for match.
                    287: ;      BX = address of translation table
                    288: ;      DI = pointer to string record
                    289: ;      SI = pointer into buffer
                    290: 
                    291: fs2:
                    292:        mov     cx,[di].s_must          ; CX = length of string
                    293:        sub     di,cx                   ; DI = pointer to string
                    294:        mov     dx,si                   ; Save pointer to start of suffix
                    295:        repe cmpsb                      ; Strings match?
                    296:        ja      fs4                     ;  no, try alternate if follows
                    297:        jb      fs5                     ;  no, cannot be in this list
                    298:        add     di,cx                   ; DI = pointer to string record
                    299:        mov     di,[di].s_suf           ; Get pointer to suffix string list
                    300:        or      di,di                   ; Is there one? (OR clears carry)
                    301:        jnz     fs2                     ;  yes, keep looking
                    302: 
                    303: ;      Match found
                    304: 
                    305: fs3:
                    306:        ret                             ;  no, we have a match
                    307: 
                    308: ;      Try alternate suffix
                    309: 
                    310: fs4:
                    311:        add     di,cx                   ; DI = pointer to string record
                    312:        mov     di,[di].s_alt           ; Get pointer to alternate
                    313:        mov     si,dx                   ; Restore SI to start of suffix
                    314:        or      di,di                   ; Is there one?
                    315:        jnz     fs2                     ;  yes, loop
                    316: 
                    317: ;      Try new first character
                    318: 
                    319: fs5:
                    320:        mov     cx,bufend               ; CX = end of buffer
                    321:        mov     si,savesi               ; Restore SI to saved value
                    322:        sub     cx,si                   ; CX = length of buffer
                    323:        ja      short fs0               ; Try next character in buffer
                    324: 
                    325: ;      No match
                    326: 
                    327: fs6:
                    328:        stc                             ; No match
                    329:        ret
                    330: 
                    331: findsub        endp
                    332: 
                    333: 
                    334: ;***   findsubi - case-insensitive worker for _findlist
                    335: ;
                    336: ;      This function does most of the work for
                    337: ;      case-insensitive multi-string searches.
                    338: ;
                    339: ;      ENTRY   BX = address of translation table
                    340: ;              CX = number of bytes left in buffer
                    341: ;              DS:SI = buffer pointer
                    342: ;              SS:BP = pointer to stack frame for _findlist
                    343: ;      EXIT    Carry set
                    344: ;                  No match
                    345: ;              Carry clear
                    346: ;                  DS:SI = pointer to first character after match
                    347: ;      USES    AX, CX, DX, DI, SI, Flags
                    348: 
                    349:        EVEN
                    350: 
                    351:        public  findsubi
                    352: findsubi proc  near
                    353:        ASSUME  DS:DGROUP, ES:DGROUP, SS:DGROUP
                    354: 
                    355: fsi0:
                    356:        xor     ax,ax                   ; AH = 0
                    357: 
                    358: ;      AH = 0
                    359: ;      BX = address of translation table
                    360: ;      CX = number of bytes left in buffer
                    361: ;      SI = buffer pointer
                    362: ;      DS = ES = SS = DGROUP
                    363: 
                    364: fsi1:
                    365:        lodsb                           ; Character in AL
                    366:        xlat byte ptr [bx]              ; Translate character to index
                    367:        or      al,al                   ; Zero means invalid 1st byte
                    368:        loopz   fsi1                    ;  if so, try next character
                    369: 
                    370: ;      Either the zero bit is set, meaning the buffer is empty,
                    371: ;      or the zero bit is clear, meaning we have a valid first
                    372: ;      character.  Either way, CX has been decremented.
                    373: 
                    374:        jz      fsi7                    ;  branch if buffer empty
                    375:        mov     savesi,si               ; Save buffer pointer
                    376:        shl     ax,1                    ; Scale to word index
                    377:        mov     di,ax
                    378:        mov     di,_stringlist[di]      ; DI points to string record
                    379:        or      di,di                   ; One byte match? (OR clears carry)
                    380:        jz      fsi4                    ;  yes, skip ahead
                    381: 
                    382: ;      Loop to search for match.
                    383: ;      BX = address of translation table
                    384: ;      DI = pointer to string record
                    385: ;      SI = pointer into buffer
                    386: 
                    387: fsi2:
                    388:        mov     cx,[di].s_must          ; CX = length of string
                    389:        sub     di,cx                   ; DI = pointer to string
                    390:        mov     dx,si                   ; Save pointer to start of suffix
                    391: fsi3:  lodsb                           ; Byte in AL, SI = SI + 1
                    392:        mov     ah,[di]                 ; Byte in AH, DI = DI + 1
                    393:        inc     di
                    394:        or      ax,2020h                ; Fold bytes onto lower case
                    395:        cmp     al,ah                   ; Compare bytes
                    396:        loope   fsi3                    ; Loop while same
                    397:        ja      fsi5                    ;  no, try alternate if follows
                    398:        jb      fsi6                    ;  no, cannot be in this list
                    399:        add     di,cx                   ; DI = pointer to string record
                    400:        mov     di,[di].s_suf           ; Get pointer to suffix string list
                    401:        or      di,di                   ; Is there one? (OR clears carry)
                    402:        jnz     fsi2                    ;  yes, keep looking
                    403: 
                    404: ;      Match found
                    405: 
                    406: fsi4:
                    407:        ret                             ;  no, we have a match
                    408: 
                    409: ;      Try alternate suffix
                    410: 
                    411: fsi5:
                    412:        add     di,cx                   ; DI = pointer to string record
                    413:        mov     di,[di].s_alt           ; Get pointer to alternate
                    414:        mov     si,dx                   ; Restore SI to start of suffix
                    415:        or      di,di                   ; Is there one?
                    416:        jnz     fsi2                    ;  yes, loop
                    417: 
                    418: ;      Try new first character
                    419: 
                    420: fsi6:
                    421:        mov     cx,bufend               ; CX = end of buffer
                    422:        mov     si,savesi               ; Restore SI to saved value
                    423:        sub     cx,si                   ; CX = length of buffer
                    424:        ja      short fsi0              ; Try next character in buffer
                    425: 
                    426: ;      No match
                    427: 
                    428: fsi7:
                    429:        stc                             ; No match
                    430:        ret
                    431: 
                    432: findsubi endp
                    433: 
                    434: 
                    435: ; int                  strnspn(s,t,n)
                    436: ; char                 *s;             /* String to search */
                    437: ; char                 *t;             /* Target list */
                    438: ; int                  n;              /* Length of s */
                    439: 
                    440: s      equ     word ptr [bp+retlen+2]
                    441: t      equ     word ptr [bp+retlen+4]
                    442: n      equ     word ptr [bp+retlen+6]
                    443: 
                    444:        EVEN
                    445: 
                    446:        public  _strnspn
                    447: _strnspn proc  near
                    448:        push    bp
                    449:        mov     bp,sp
                    450:        push    di
                    451:        push    si
                    452:        push    ds
                    453:        pop     es
                    454:        cld
                    455:        mov     bx,t                    ; BX = t
                    456:        mov     di,bx                   ; DI = t
                    457:        xor     al,al                   ; Search for 0 byte
                    458:        mov     cx,0FFFFh
                    459:        repne scasb
                    460:        dec     di                      ; Back up to 0
                    461:        sub     di,bx                   ; DI = length of t
                    462:        jz      spn1                    ; Done if length of t is 0
                    463:        mov     dx,di                   ; DX = length of t
                    464:        mov     si,s                    ; SI = s
                    465:        mov     cx,n                    ; CX = length of s
                    466:        jcxz    spn1                    ; Check for null string
                    467:        push    bp
                    468: spn0:  lodsb                           ; AL = next char in s
                    469:        mov     bp,cx                   ; BP = length of s
                    470:        mov     cx,dx                   ; CX = length of t
                    471:        mov     di,bx                   ; DI = t
                    472:        repne scasb                     ; Scan until match found
                    473:        mov     cx,bp                   ; CX = length of s
                    474:        loope   spn0                    ; Loop if match found
                    475:        pop     bp
                    476:        je      spn1                    ; Skip ahead if end of s reached
                    477:        dec     si                      ; Back up one char
                    478: spn1:  sub     si,s                    ; SI = length of prefix
                    479:        mov     ax,si                   ; AX = length of prefix
                    480:        pop     si
                    481:        pop     di
                    482:        pop     bp
                    483:        ret
                    484: _strnspn endp
                    485: 
                    486: 
                    487: ; int                  strncspn(s,t,n)
                    488: ; char                 *s;             /* String to search */
                    489: ; char                 *t;             /* Target list */
                    490: ; int                  n;              /* Length of s */
                    491: 
                    492:        EVEN
                    493: 
                    494:        public  _strncspn
                    495: _strncspn proc near
                    496:        push    bp
                    497:        mov     bp,sp
                    498:        push    di
                    499:        push    si
                    500:        push    ds
                    501:        pop     es
                    502:        cld
                    503:        mov     bx,t                    ; BX = t
                    504:        mov     di,bx                   ; DI = t
                    505:        xor     al,al                   ; Search for 0 byte
                    506:        mov     cx,0FFFFh
                    507:        repne scasb
                    508:        dec     di                      ; Back up to 0
                    509:        sub     di,bx                   ; DI = length of t
                    510:        mov     ax,n                    ; Assume length of t is 0
                    511:        jz      cspn2                   ; Done if length of t is 0
                    512:        mov     dx,di                   ; DX = length of t
                    513:        mov     si,s                    ; SI = s
                    514:        mov     cx,ax                   ; CX = length of s
                    515:        jcxz    cspn1                   ; Check for null string
                    516:        push    bp
                    517: cspn0: lodsb                           ; AL = next char in s
                    518:        mov     bp,cx                   ; BP = length of s
                    519:        mov     cx,dx                   ; CX = length of t
                    520:        mov     di,bx                   ; DI = t
                    521:        repne scasb                     ; Scan until match found
                    522:        mov     cx,bp                   ; CX = length of s
                    523:        loopne  cspn0                   ; Loop if match not found
                    524:        pop     bp
                    525:        jne     cspn1                   ; Skip ahead if end of s reached
                    526:        dec     si                      ; Back up one char
                    527: cspn1: sub     si,s                    ; SI = length of prefix
                    528:        mov     ax,si                   ; AX = length of prefix
                    529: cspn2: pop     si
                    530:        pop     di
                    531:        pop     bp
                    532:        ret
                    533: _strncspn endp
                    534: 
                    535: 
                    536: ;      cmpsen - case-sensitive comparison
                    537: ;
                    538: ;      ENTRY   DS:SI = buffer
                    539: ;              ES:DI = string
                    540: ;              CX = length of string
                    541: ;      EXIT    CX = length of string unused
                    542: ;              DI = unused portion of string
                    543: ;              Z set
                    544: ;                  match found
                    545: ;              Z clear
                    546: ;                  no match
                    547: ;      USES    CX, DI, SI, Flags
                    548: 
                    549:        EVEN
                    550: 
                    551: cmpsen proc    near
                    552:        repe cmpsb
                    553:        ret
                    554: cmpsen endp
                    555: 
                    556: 
                    557: ;      cmpinsen - case-insensitive comparison
                    558: ;
                    559: ;      ENTRY   DS:SI = buffer
                    560: ;              ES:DI = string
                    561: ;              CX = length of string
                    562: ;      EXIT    CX = length of string unused
                    563: ;              DI = unused portion of string
                    564: ;              Z set
                    565: ;                  match found
                    566: ;              Z clear
                    567: ;                  no match
                    568: ;      USES    AX, CX, DI, SI, Flags
                    569: 
                    570:        EVEN
                    571: 
                    572: cmpinsen proc  near
                    573: cmpi0: lodsb                           ; Byte in AL, SI = SI + 1
                    574:        mov     ah,[di]                 ; Byte in AH, DI = DI + 1
                    575:        inc     di
                    576:        or      ax,2020h                ; Fold bytes onto lower case
                    577:        cmp     al,ah                   ; Compare bytes
                    578:        loope   cmpi0                   ; Loop while same
                    579:        ret
                    580: cmpinsen endp
                    581: 
                    582: 
                    583: ; void                 matchstrings(s1,s2,len,nmatched,leg)
                    584: ; char                 *s1;            /* First string */
                    585: ; char                 *s2;            /* Second string */
                    586: ; int                  len;            /* Length */
                    587: ; int                  *nmatched;      /* Number of bytes matched */
                    588: ; int                  *leg;           /* Less than, equal, greater than */
                    589: 
                    590: cm_s1          equ     word ptr [bp+retlen+2]
                    591: cm_s2          equ     word ptr [bp+retlen+4]
                    592: cm_len         equ     word ptr [bp+retlen+6]
                    593: cm_nmatched    equ     word ptr [bp+retlen+8]
                    594: cm_leg         equ     word ptr [bp+retlen+10]
                    595: 
                    596:        EVEN
                    597: 
                    598:        public  _matchstrings
                    599: _matchstrings proc near
                    600:        ASSUME  DS:DGROUP, ES:NOTHING, SS:DGROUP
                    601: 
                    602:        push    bp
                    603:        mov     bp,sp
                    604:        push    di
                    605:        push    si
                    606:        push    ds
                    607:        pop     es
                    608:     ASSUME     ES:DGROUP
                    609:        mov     di,cm_s2
                    610:        mov     si,cm_s1
                    611:        mov     cx,cm_len
                    612:        cmp     _casesen,0
                    613:        je      cm0
                    614:        call    cmpsen
                    615:        jmp     short cm1
                    616: cm0:   call    cmpinsen
                    617: cm1:   mov     bx,cm_leg
                    618:        mov     word ptr [bx],0         ; Assume equal
                    619:        jz      cm2                     ;  yes, skip ahead
                    620:        mov     word ptr [bx],1         ; Assume greater than
                    621:        jg      cm1a                    ;  yes, skip ahead
                    622:        mov     word ptr [bx],-1        ; Less than
                    623: cm1a:  dec     si
                    624: cm2:   sub     si,cm_s1
                    625:        mov     bx,cm_nmatched
                    626:        mov     [bx],si
                    627:        pop     si
                    628:        pop     di
                    629:        pop     bp
                    630:        ret
                    631: 
                    632: _matchstrings endp
                    633: 
                    634: 
                    635: ; int                  strcmp(s1,s2)
                    636: ; char                 *s1;            /* First string */
                    637: ; char                 *s2;            /* Second string */
                    638: 
                    639:        public  _strcmp
                    640: _strcmp        proc    near
                    641:        push    bp
                    642:        mov     bp,sp
                    643:        push    di
                    644:        push    si
                    645:        push    ds
                    646:        pop     es
                    647:        mov     si,[bp+4]               ; DS:SI = s1
                    648:        mov     di,[bp+6]               ; ES:DI = s2
                    649: sc0:   lodsb                           ; AL = *s1++
                    650:        scasb                           ; AL - *s2++
                    651:        jne     sc1                     ;  branch if no match
                    652:        or      al,al                   ; End of s1?
                    653:        jne     sc0                     ;  no, loop
                    654:        cbw                             ; AX = 0
                    655:        jmp     short sc2               ; Exit
                    656: sc1:   mov     ax,1                    ; Assume s1 > s2
                    657:        jg      sc2                     ;  yes, branch
                    658:        neg     ax                      ; s1 < s2
                    659: sc2:   pop     si
                    660:        pop     di
                    661:        pop     bp
                    662:        ret
                    663: _strcmp        endp
                    664: 
                    665: 
                    666:        public  _bpt
                    667: _bpt   proc    near
                    668:        int     3
                    669:        ret
                    670: _bpt   endp
                    671: 
                    672: _text  ends
                    673: 
                    674: _data  segment word public 'data'
                    675: _data  ends
                    676: 
                    677: end

unix.superglobalmegacorp.com

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