home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / tptools.zip / FIRSTED.ZIP / EDSTRING.ASM < prev    next >
Assembly Source File  |  1987-12-21  |  9KB  |  224 lines

  1.  
  2. ;       EDSTRING.ASM
  3. ;       ED 4.0
  4. ;       Copyright (c) 1985, 87 by Borland International, Inc.
  5. ;
  6. ;       Primitive string routines for Editor Toolbox
  7.  
  8.  
  9. DATA    SEGMENT BYTE PUBLIC
  10.  
  11. DATA    ENDS
  12.  
  13. CODE    SEGMENT BYTE PUBLIC
  14.  
  15.         ASSUME  CS:CODE,DS:DATA
  16.  
  17.         PUBLIC  EdLongUpCase, EdLongPosFwd, EdLongPosBack
  18.  
  19. ;****************************************************** EdLongUpcase
  20.  
  21. ;procedure EdLongUpcase(var Buffer; Size : Word);
  22.  
  23. ;Fast uppercasing routine. Buffer is a textline or a standard string
  24. ;Size is the size of the buffer.
  25.  
  26. ;equates for parameters:
  27. LUSize          EQU     WORD PTR  [BP+6]
  28. LUBuffer        EQU     DWORD PTR [BP+8]
  29.  
  30. EdLongUpCase    PROC FAR
  31.  
  32.         PUSH    BP                      ;Save BP
  33.         MOV     BP,SP                   ;Set up stack frame
  34.         MOV     DX,DS                   ;Save DS in DX
  35.  
  36.         LDS     SI,LUBuffer             ;DS:SI points to Buffer
  37.         MOV     AX,DS                   ;AX = DS
  38.         MOV     ES,AX                   ;ES = DS
  39.         MOV     DI,SI                   ;ES:DI points to Buffer
  40.         MOV     CX,LUSize               ;Total size of Buffer
  41.         JCXZ    LUDone                  ;Done if CX = 0
  42.         INC     CX                      ;Account for junk byte
  43.         MOV     AH,0DFh                 ;AH = UpCase mask
  44.         MOV     BH,'z'                  ;BH = 'z'
  45.         MOV     BL,'a'                  ;BL = 'a'
  46.         CLD                             ;Go forward
  47. LUNext:
  48.         LODSB                           ;Next char into AL
  49.         CMP     AL,BL                   ;AL < 'a'?
  50.         JB      LUNoStore               ;If so, don't change the char
  51.         CMP     AL,BH                   ;AL > 'z'?
  52.         JA      LUNoStore               ;If so, don't change the char
  53.         AND     AL,AH                   ;Else, convert to uppercase
  54.         STOSB                           ;Store the converted character
  55.         LOOP    LUNext                  ;Repeat if CX <> 0
  56.         JMP     LUDone                  ;Done if CX = 0
  57. LUNoStore:
  58.         INC     DI                      ;Skip this character
  59.         LOOP    LUNext                  ;Repeat if CX <> 0
  60. LUDone:
  61.         MOV     DS,DX                   ;Restore DS from DX
  62.         MOV     SP,BP                   ;Restore SP
  63.         POP     BP                      ;Restore BP
  64.         RET     6                       ;Remove parameters and return
  65.  
  66. EdLongUpcase    ENDP
  67.  
  68. ;****************************************************** EdLongPosFwd
  69.  
  70. ;function EdLongPosFwd(var Buffer; Start, Size : Word; var Pattern : VarString) : Word;
  71.  
  72. ;Return the position of pattern in buffer, or 0 if not found
  73. ;Buffer is a textline or a standard string
  74. ;Start indicates the first character to look at
  75.  
  76. ;equates for parameters:
  77. PFPattern       EQU     DWORD PTR [BP+6]
  78. PFSize          EQU     WORD PTR  [BP+10]
  79. PFStart         EQU     WORD PTR  [BP+12]
  80. PFBuffer        EQU     DWORD PTR [BP+14]
  81.  
  82. EdLongPosFwd    PROC FAR
  83.  
  84.         PUSH    BP                      ;Save BP
  85.         MOV     BP,SP                   ;Set up stack frame
  86.         PUSH    DS                      ;Save DS
  87.  
  88.         LES     DI,PFBuffer             ;ES:DI => Buffer
  89.         MOV     BX,DI                   ;BX = Ofs(Buffer)
  90.         INC     BX                      ;BX = Ofs(Buffer) + 1
  91.  
  92.         MOV     AX,PFStart              ;AX = Start
  93.         ADD     DI,AX                   ;DI has starting offset
  94.  
  95.         MOV     CX,PFSize               ;CX = Size of buffer
  96.         SUB     CX,AX                   ;CX = Size - Start
  97.         INC     CX                      ;CX = (Size - Start) + 1
  98.  
  99.         LDS     SI,PFPattern            ;DS:SI => Pattern[0]
  100.         MOV     DL,[SI]                 ;DL = Length(Pattern)
  101.         TEST    DL,DL                   ;Length(Pattern) = 0?
  102.         JZ      PFError                 ;If so, we're done
  103.         XOR     DH,DH                   ;Clear DH
  104.         DEC     DL                      ;DX = Length(Pattern)-1
  105.         SUB     CX,DX                   ;CX = Size - (Length(Pattern)-1)
  106.         JBE     PFError                 ;Error if Size is less
  107.         INC     SI                      ;DS:SI => Pattern[1]
  108.         CLD                             ;Go forward
  109.         LODSB                           ;AL = Pattern[1];
  110.                                         ;DS:SI => Pattern[2]
  111.  
  112. PFNext: ;Search for first character in Pattern
  113.  
  114.         REPNE   SCASB                   ;Search forward for Pattern[1]
  115.         JNE     PFError                 ;Done if not found
  116.         TEST    DX,DX                   ;If Length = 1 (DX = 0)
  117.         JZ      PFFound                 ; the "string" was found
  118.  
  119.         ;Search for remainder of Pattern
  120.  
  121.         PUSH    CX                      ;Save CX
  122.         PUSH    DI                      ;Save DI
  123.         PUSH    SI                      ;Save SI
  124.         MOV     CX,DX                   ;CX = Length(Pattern) - 1
  125.         REPE    CMPSB                   ;Does rest of string match?
  126.         POP     SI                      ;Restore SI
  127.         POP     DI                      ;Restore DI
  128.         POP     CX                      ;Restore CX
  129.         JNE     PFNext                  ;Try again if no match
  130.  
  131. PFFound:        ;Calculate number of bytes searched and return in AX
  132.  
  133.         MOV     AX,DI                   ;AX = Offset where found
  134.         SUB     AX,BX                   ;Subtract starting offset
  135.         JMP     PFDone                  ;Done
  136. PFError:
  137.         XOR     AX,AX                   ;Return 0
  138. PFDone:
  139.         POP     DS                      ;Restore DS
  140.         MOV     SP,BP                   ;Restore SP
  141.         POP     BP                      ;Restore BP
  142.         RET     12                      ;Remove parameters and return
  143.  
  144. EdLongPosFwd    ENDP
  145.  
  146. ;****************************************************** EdLongPosBack
  147.  
  148. ;function EdLongPosBack(var Buffer; Start : Word; var Pattern : VarString) : Word;
  149.  
  150. ;Return the position of pattern in buffer, or 0 if not found
  151. ;Buffer is a textline or a standard string
  152. ;Scan backwards from Start to 1
  153.  
  154. ;equates for parameters:
  155. PBPattern       EQU     DWORD PTR [BP+6]
  156. PBStart         EQU     WORD PTR  [BP+10]
  157. PBBuffer        EQU     DWORD PTR [BP+12]
  158.  
  159. EdLongPosBack   PROC FAR
  160.  
  161.         PUSH    BP                      ;Save BP
  162.         MOV     BP,SP                   ;Set up stack frame
  163.         PUSH    DS                      ;Save DS
  164.  
  165.         LES     DI,PBBuffer             ;ES:DI => Buffer
  166.         MOV     BX,DI                   ;BX = Ofs(Buffer)
  167.         MOV     AX,PBStart              ;AX = Start
  168.         ADD     DI,AX                   ;DI has starting offset
  169.         MOV     CX,AX                   ;CX = maximum number of bytes to scan
  170.         LDS     SI,PBPattern            ;DS:SI => Pattern[0]
  171.         MOV     DL,[SI]                 ;DL = Length(Pattern)
  172.         TEST    DL,DL                   ;Length(Pattern) = 0?
  173.         JZ      PBError                 ;If so, we're done
  174.         XOR     DH,DH                   ;Clear DH
  175.         ADD     SI,DX                   ;DS:SI points to end of Pattern
  176.         DEC     DX                      ;DX = Length(Pattern)-1
  177.         SUB     CX,DX                   ;CX = Start - (Length(Pattern)-1)
  178.         JBE     PBError                 ;Error if Start is less
  179.         STD                             ;Go backwards
  180.         LODSB                           ;AL = Pattern[Length(Pattern)];
  181.                                         ;DS:SI => Pattern[Length(Pattern)-1]
  182.  
  183. PBNext: ;Search for last character in Pattern
  184.  
  185.         REPNE   SCASB                   ;Search backward for char in AL
  186.         JNE     PBError                 ;Done if not found
  187.         TEST    DX,DX                   ;If Length = 1 (DX = 0)
  188.         JZ      PBFound                 ; the "string" was found
  189.  
  190.         ;Search for remainder of Pattern
  191.  
  192.         PUSH    CX                      ;Save CX
  193.         PUSH    DI                      ;Save DI
  194.         PUSH    SI                      ;Save SI
  195.         MOV     CX,DX                   ;CX = Length(Pattern) - 1
  196.         REPE    CMPSB                   ;Does rest of string match?
  197.         POP     SI                      ;Restore SI
  198.         POP     DI                      ;Restore DI
  199.         POP     CX                      ;Restore CX
  200.         JNE     PBNext                  ;Try again if no match
  201.  
  202. PBFound:        ;Calculate number of bytes searched and return in AX
  203.  
  204.         MOV     AX,DI                   ;AX = Offset where last character in
  205.                                         ; Pattern was found
  206.         SUB     AX,DX                   ;Subtract Length(Pattern) - 1
  207.         SUB     AX,BX                   ;Subtract Ofs(Buffer)
  208.         INC     AX                      ;Add one to get the relative offset
  209.         JMP     PBDone                  ;Done
  210. PBError:
  211.         XOR     AX,AX                   ;Return 0
  212. PBDone:
  213.         CLD                             ;Reset direction flag
  214.         POP     DS                      ;Restore DS
  215.         MOV     SP,BP                   ;Restore SP
  216.         POP     BP                      ;Restore BP
  217.         RET     10                      ;Remove parameters and return
  218.  
  219. EdLongPosBack   ENDP
  220.  
  221. CODE    ENDS
  222.  
  223.         END
  224.