home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / progm / tpfast.zip / FASTSTR.ASM < prev    next >
Assembly Source File  |  1990-09-26  |  51KB  |  943 lines

  1. ;   _______________________________________________________________
  2. ;  |                                                               |
  3. ;  |            Copyright (C) 1989,1990  Steven Lutrov             |
  4. ;  |_______________________________________________________________|____
  5. ;  |                                                               |    |
  6. ;  |  Program Title : FastStr.Asm                                  |    | ___
  7. ;  |  Author        : Steven Lutrov                                |    |    |
  8. ;  |  Revision      : 2.01                                         |    |    |
  9. ;  |  Date          : 1990-03-16                                   |    |    |
  10. ;  |  Language      : Turbo Assembler                              |    |    |
  11. ;  |                                                               |    |    |
  12. ;  |  Description   : Assembly Functions For String Manipulation.  |    |    |
  13. ;  |                : Tested on Turbo Pascal 5.0 & 5.5             |    |    |
  14. ;  |                                                               |    |    |
  15. ;  |_______________________________________________________________|    |    |
  16. ;      |                                                                |    |
  17. ;      |________________________________________________________________|    |
  18. ;          |                                                                 |
  19. ;          |_________________________________________________________________|
  20. ;
  21.  
  22.  
  23. Code    Segment Word  Public
  24.  
  25. Assume  Cs:Code,Ds:Data
  26.  
  27. Public  Changechar,Compare,Stringend,Deletechar,Deleteleft,Deleteright
  28. Public  Leftend,Lowercase,Overwrite,Padcentre,Padends,Padleft,Padright
  29. Public  Replace,Rightend,Seekstring,Stringof,Uppercase,Wordcount
  30.  
  31.  
  32. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  33. ;Procedure Changechar(Var Strx: Stype; Search,Replace: Char);
  34. ;
  35. ;
  36. Data    Segment
  37.         Extrn  Errreturn:Byte
  38. Data    Ends
  39. ;
  40. ;
  41. Changechar Proc Far
  42.                 Push Bp                         ;Save Bp
  43.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  44.                 Mov  Errreturn,0                ;Assume Char Found
  45.                 Les  Di,Dword Ptr[Bp+10]        ;Es:Di Pts To Strx
  46.                 Sub  Dx,Dx                      ;Flags That A Char Found
  47.                 Mov  Al,[Bp+6]                  ;Get Replacement Char
  48.                 Mov  Ah,[Bp+8]                  ;Search Character
  49.                 Sub  Cx,Cx                      ;Clear Cx
  50.                 Mov  Cl,Es:[Di]                 ;Get String Length
  51.                 Jcxz Changechar3                ;Quit If Null String
  52. Changechar1:    Inc  Di                         ;Forward String Ptr
  53.                 Cmp  Es:[Di],Ah                 ;Search Char?
  54.                 Jne  Changechar2                ;Jump Ahead If Not
  55.                 Mov  Es:[Di],Al                 ;Else Change Char
  56.                 Inc  Dx                         ;Flag That A Char Found
  57. Changechar2:    Loop Changechar1                ;Go Do Next Char
  58.                 Or   Dx,Dx                      ;Test If Char Found
  59.                 Jnz  Changechar4                ;Jump Ahead If So
  60. Changechar3:    Inc  Errreturn                  ;Else 1 = Char Not Found
  61. Changechar4:    Pop  Bp                         ;Restore Bp And Quit
  62.                 Ret  8
  63. Changechar Endp
  64.  
  65.  
  66. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  67. ;Function Compare(Strg1,Strg2: Stype): Boolean;
  68. ;
  69. ;
  70. Compare Proc Far
  71.                 Mov  Bx,Sp                      ;Bx Pts To Stack
  72.                 Push Ds                         ;Save Turbo'S Ds
  73.                 Les  Di,Ss:Dword Ptr[Bx+8]      ;Es:Di Pts To Strg1
  74.                 Lds  Si,Ss:Dword Ptr[Bx+4]      ;Ds:Si Pts To Strg2
  75.                 Sub  Cx,Cx                      ;Clear Cx
  76.                 Mov  Cl,[Si]                    ;Get Strg2 Length
  77.                 Cmp  Cl,Es:[Di]                 ;Equal To Strg1 Length?
  78.                 Jne  Compare6                   ;Quit If Not
  79.                 Jcxz Compare5                   ;Quit If Both Null
  80. Compare1:       Inc  Di                         ;Forward Strg1 Ptr
  81.                 Inc  Si                         ;Forward Strg2 Ptr
  82.                 Mov  Al,[Si]                    ;Get Strg2 Char
  83.                 Cmp  Al,Es:[Di]                 ;Compare To Strg1 Char
  84.                 Je   Compare4                   ;Loop If Equal
  85.                 Cmp  Al,122                     ;Above Lower Case Vals?
  86.                 Ja   Compare6                   ;Quit If So
  87.                 Cmp  Al,97                      ;Lower Case Char?
  88.                 Jnae Compare2                   ;Jump Ahead If Not
  89.                 Sub  Al,32                      ;Make Lower Case
  90.                 Jmp  Short Compare3             ;Go Test It
  91. Compare2:       Cmp  Al,90                      ;Above Upper Case Vals?
  92.                 Ja   Compare6                   ;Quit If So
  93.                 Cmp  Al,65                      ;Upper Case Char?
  94.                 Jnae Compare6                   ;Quit If Not
  95.                 Add  Al,32                      ;Make Lower Case
  96. Compare3:       Cmp  Al,Es:[Di]                 ;Compare To Strg1 Char
  97.                 Jne  Compare6                   ;Quit If Not Equal
  98. Compare4:       Loop Compare1                   ;Go Do Next Char
  99. Compare5:       Mov  Al,1                       ;Return True
  100.                 Jmp  Short Compare7             ;Jump Ahead
  101. Compare6:       Mov  Al,0                       ;Return False
  102. Compare7:       Pop  Ds                         ;Restore Ds And Quit
  103.                 Ret  8
  104. Compare Endp
  105.  
  106.  
  107. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  108. ;Function Stringend(Strx: Stype; Numberchars: Integer): Stype;
  109. ;
  110. ;
  111. Data    Segment
  112.         Extrn  Errreturn:Byte
  113. Data    Ends
  114. ;
  115. ;
  116. Stringend Proc Far
  117.                 Push Bp                         ;Save Bp
  118.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  119.                 Push Ds                         ;Save Ds
  120.                 Les  Di,Dword Ptr[Bp+12]        ;Es:Di Pts To Return Strx
  121.                 Lds  Si,Dword Ptr[Bp+8]         ;Ds:Si Pts To Source Strx
  122.                 Sub  Cx,Cx                      ;Clear Cx
  123.                 Mov  Es:[Di],Cl                 ;Return Null String If Error
  124.                 Mov  Cl,[Bp+6]                  ;Get Numberchars (255 Max)
  125.                 Sub  Bx,Bx                      ;Clear Bx
  126.                 Mov  Bl,[Si]                    ;Strx Length In Bx
  127.                 Mov  Dl,1                       ;1 = Null String
  128.                 Or   Bl,Bl                      ;Test For Null String
  129.                 Jz   Stringend3                 ;Quit Routine If Null
  130.                 Dec  Dl                         ;0 = No Error
  131.                 Cmp  Cx,Bx                      ;Numberchars < Length?
  132.                 Jbe  Stringend1                 ;Jump Ahead If So
  133.                 Mov  Cx,Bx                      ;Else Return Whole String
  134.                 Mov  Dl,2                       ;2 = Numberchars Greater Than Length
  135. Stringend1:     Mov  Es:[Di],Cl                 ;Return Strx Descriptor
  136.                 Sub  Bx,Cx                      ;Length Minus Numberchars
  137.                 Inc  Di                         ;Forward Return Strx Ptr To First Char
  138.                 Inc  Si                         ;Save For Source Strx
  139.                 Add  Si,Bx                      ;Add Starting Offset To Source
  140. Stringend2:     Cld                             ;Direction Forward
  141.                 Rep Movsb                       ;Move The Portion Of The String
  142. Stringend3:     Pop  Ds                         ;Restore Ds
  143.                 Mov  Errreturn,Dl               ;Set Errreturn
  144.                 Pop  Bp                         ;Restore Bp And Quit
  145.                 Ret  6
  146. Stringend Endp
  147.  
  148.  
  149.  
  150. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  151. ;Procedure Deletechar(Var Strx: Stype; Ch: Char);
  152. ;
  153. ;
  154. Data    Segment
  155.         Extrn Errreturn:Byte
  156. Data    Ends
  157. ;
  158. ;
  159. ;
  160. Deletechar Proc Far
  161.                 Cld                             ;Set Direction Flag
  162.                 Mov  Errreturn,1                ;1 = Char Not Found
  163.                 Push Bp                         ;Save Bp
  164.                 Push Ds                         ;Save Ds
  165.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  166.                 Les  Di,Dword Ptr [Bp+10]       ;Get String Address
  167.                 Mov  Al,[Bp+8]                  ;Get Char To Delete
  168.                 Sub  Bp,Bp                      ;Use Bp As Errreturn Flag
  169.                 Push Es                         ;Push Es...
  170.                 Pop  Ds                         ;...Then Copy Into Ds
  171.                 Mov  Bx,Di                      ;Bx Will Pt To Descriptor
  172.                 Sub  Cx,Cx                      ;Clear Cx
  173.                 Mov  Cl,Es:[Di]                 ;Get String Length
  174.                 Jcxz Deletechar3                ;Quit If Null String
  175.                 Inc  Di                         ;Pt Di To Start Of String
  176.                 Mov  Si,Di                      ;Copy Into Si
  177.                 Cld                             ;Direction Forward In Movsb
  178. Deletechar1:    Cmp  [Si],Al                    ;Check For The Character
  179.                 Je   Deletechar2                ;Jump If Char Found
  180.                 Movsb                           ;Move The Char
  181.                 Loop Deletechar1                ;Go Check Next Char
  182.                 Jmp  Short Deletechar3          ;Finished
  183. Deletechar2:    Inc  Si                         ;Forward Source Ptr
  184.                 Dec  Byte Ptr[Bx]               ;Decrease String Descriptor
  185.                 Inc  Bp                         ;Flag That Char Found
  186.                 Loop Deletechar1                ;Go Check Next Char
  187. Deletechar3:    Pop  Ds                         ;Restore Ds
  188.                 Or   Bp,Bp                      ;Test Bp For Zero
  189.                 Jz   Deletechar4                ;Jump If No Match Found
  190.                 Dec  Errreturn                  ;Else Errreturn = 0
  191. Deletechar4:    Pop  Bp                         ;Restore Bp And Quit
  192.                 Ret  6
  193. Deletechar Endp
  194.  
  195.  
  196. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  197. ;Procedure Deleteleft(Var Strx: Stype; Border: Char);
  198. ;
  199. ;
  200. Data    Segment
  201.         Extrn  Errreturn:Byte
  202. Data    Ends
  203. ;
  204. ;
  205. Deleteleft Proc Far
  206.                 Mov  Errreturn,0                ;Assume No Error
  207.                 Push Ds                         ;Ds Is Changed
  208.                 Push Bp                         ;Save Bp
  209.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  210.                 Les  Di,Dword Ptr [Bp+10]       ;Es:Di Pts To String
  211.                 Lds  Si,Dword Ptr [Bp+10]       ;So Does Ds:Si
  212.                 Mov  Si,Di                      ;Keep Si At Descriptor
  213.                 Mov  Al,[Bp+8]                  ;Get The Border Character
  214.                 Pop  Bp                         ;Restore Bp
  215.                 Sub  Cx,Cx                      ;Clear Cx
  216.                 Mov  Cl,Es:[Di]                 ;String Length In Cx
  217.                 Jcxz Deleteleft1                ;Quit If Null
  218.                 Mov  Bx,Cx                      ;Copy Of String Length In Bx
  219.                 Inc  Di                         ;Pt To First Byte Of String
  220.                 Cld                             ;Direction Forward
  221.                 Repne Scasb                     ;Look For The Border Character
  222.                 Jnz  Deleteleft1                ;Quit If Can'T Find Char
  223.                 Mov  Dx,Di                      ;Copy Of Di To Dx
  224.                 Dec  Dx                         ;Point To Char Before
  225.                 Sub  Dx,Si                      ;Number Characters To Delete
  226.                 Dec  Dx                         ;Don'T Delete Border Char
  227.                 Mov  Cx,Bx                      ;Old String Length
  228.                 Sub  Cx,Dx                      ;New String Length
  229.                 Mov  [Si],Cl                    ;Set New String Length
  230.                 Inc  Si                         ;Point Si To Start Of String
  231.                 Xchg Di,Si                      ;Reverse Pointers For Movsb
  232.                 Dec  Si                         ;Don'T Remove Border Char
  233.                 Rep Movsb                       ;Move The Characters
  234.                 Pop  Ds                         ;Restore Ds
  235.                 Ret  6                          ;Quit
  236. Deleteleft1:    Pop  Ds                         ;---Error Case:
  237.                 Inc  Errreturn                  ;1 = Null String Or Char Not Found
  238.                 Ret  6                          ;Quit
  239. Deleteleft Endp
  240.  
  241.  
  242.  
  243. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  244. ;Procedure Deleteright(Var Strx: Stype; Border: Char);
  245. ;
  246. ;
  247. Data    Segment
  248.         Extrn  Errreturn:Byte
  249. Data    Ends
  250. ;
  251. ;
  252. Deleteright Proc Far
  253.                 Push Bp                         ;Save Bp
  254.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  255.                 Les  Di,Dword Ptr [Bp+8]        ;Load String Address
  256.                 Mov  Si,Di                      ;Keep Si At Descriptor
  257.                 Mov  Al,[Bp+6]                  ;Get The Border Character
  258.                 Sub  Cx,Cx                      ;Clear Cx
  259.                 Mov  Errreturn,1                ;1 = Null String
  260.                 Mov  Cl,Es:[Di]                 ;String Length In Cx
  261.                 Jcxz Deleteright3               ;Quit If Null
  262.                 Add  Di,Cx                      ;Point Di To End Of String
  263. Deleteright1:   Cmp  [Di],Al                    ;Test For The Border Char
  264.                 Je   Deleteright2               ;If Found, Jump Ahead
  265.                 Dec  Di                         ;Else, Point To Next Char
  266.                 Loop Deleteright1               ;Go Test Next Char
  267.                 Jmp  Short Deleteright3         ;Char Not Found
  268. Deleteright2:   Mov  Es:[Si],Cl                 ;Set New String Length
  269.                 Dec  Errreturn                  ;No Error
  270. Deleteright3:   Pop  Bp                         ;Restore Bp And Quit
  271.                 Ret  6
  272. Deleteright Endp
  273.  
  274.  
  275.  
  276.  
  277. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  278. ;Function Leftend(Var Strx: Stype; Border: Char): Stype;
  279. ;
  280. ;
  281. Data    Segment
  282.         Extrn  Errreturn:Byte
  283. Data    Ends
  284. ;
  285. ;
  286. Leftend Proc Far
  287.                 Mov  Dl,1                       ;1 = Border Char Not Found
  288.                 Push Bp                         ;Save Bp
  289.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  290.                 Push Ds                         ;Save Ds
  291.                 Les  Di,Dword Ptr[Bp+8]         ;Es:Di Pts To Strx
  292.                 Sub  Cx,Cx                      ;Clear Cx
  293.                 Mov  Cl,Es:[Di]                 ;String Length To Cx
  294.                 Jcxz Leftend2                   ;Quit If Zero
  295.                 Inc  Di                         ;Pt To 1St Byte Of Strx
  296.                 Mov  Bx,Di                      ;Copy Start Position
  297.                 Cld                             ;Direction Forward
  298.                 Mov  Al,[Bp+6]                  ;Border Character
  299.                 Repne Scasb                     ;Search For The Character
  300.                 Jnz  Leftend1                   ;Not Found, Skip Ptr Dec
  301.                 Dec  Di                         ;Pull Back Ptr
  302.                 Dec  Dl                         ;Errreturn = 0, No Error
  303. Leftend1:       Sub  Di,Bx                      ;Distance To Char
  304.                 Mov  Cx,Di                      ;Use As Counter
  305.                 Mov  Ax,Es                      ;Transfer Es...
  306.                 Mov  Ds,Ax                      ;To Ds
  307.                 Mov  Si,Bx                      ;Now Ds:Si Pts To Start Of Strx
  308. Leftend2:       Les  Di,Dword Ptr[Bp+12]        ;Now Es:Di Pts To Return String
  309.                 Mov  Es:[Di],Cl                 ;Set Return Descriptor
  310.                 Jcxz Leftend3                   ;Jump Ahead If Null Strx
  311.                 Inc  Di                         ;Forward Ptr
  312.                 Rep  Movsb                      ;Move The String
  313. Leftend3:       Pop  Ds                         ;Restore Ds
  314.                 Mov  Errreturn,Dl               ;Set Errreturn
  315.                 Pop  Bp                         ;Restore Bp And Quit
  316.                 Ret  6
  317. Leftend Endp
  318.  
  319.  
  320. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  321. ;Procedure Lowercase(Var Strx: Stype);
  322. ;
  323. ;
  324. Lowercase Proc Far
  325.                 Mov  Bx,Sp                      ;Bx Points To Stack
  326.                 Les  Di,Ss:Dword Ptr[Bx+4]      ;Es:Di Pts To String
  327.                 Sub  Cx,Cx                      ;Clear Cx
  328.                 Mov  Cl,Es:[Di]                 ;Get String Length
  329.                 Jcxz Lowercase3                 ;Quit If Null
  330. Lowercase1:     Inc  Di                         ;Pt To Next Char Of Strx
  331.                 Cmp  Es:Byte Ptr [Di],'Z'       ;Test High Char
  332.                 Ja   Lowercase2                 ;Skip Ahead If Above
  333.                 Cmp  Es:Byte Ptr [Di],'A'       ;Test Low Char
  334.                 Jb   Lowercase2                 ;Skip Ahead If Below
  335.                 Add  Es:Byte Ptr [Di],32        ;Change The Char
  336. Lowercase2:     Loop Lowercase1                 ;Go Test Next Character
  337. Lowercase3:     Ret  4
  338. Lowercase Endp
  339.  
  340.  
  341. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  342. ;Procedure Overwrite(Var Strx: Stype; Substrg: Stype; Position: Integer);
  343. ;
  344. ;
  345. Data    Segment
  346.         Extrn  Errreturn:Byte
  347. Data    Ends
  348. ;
  349. ;
  350. Overwrite Proc Far
  351.                 Mov  Errreturn,0                ;Assume No Error
  352.                 Push Bp                         ;Save Bp
  353.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  354.                 Push Ds                         ;Ds Is Changed
  355.                 Les  Di,Dword Ptr [Bp+12]       ;Es:Di Pts To Strx
  356.                 Mov  Bx,Di                      ;Bx Points To Strx
  357.                 Sub  Cx,Cx                      ;Clear Cx
  358.                 Mov  Cl,[Bp+6]                  ;Position In Cx
  359.                 Jcxz Overwrite2                 ;Quit If Zero
  360.                 Cmp  Cl,Es:[Di]                 ;Is Position Within Strx?
  361.                 Ja   Overwrite2                 ;Quit If Not
  362.                 Mov  Dx,Cx                      ;Keep For Error Check
  363.                 Add  Di,Cx                      ;Add To String Ptr
  364.                 Lds  Si,Dword Ptr [Bp+8]        ;Ds:Si Pts To Substring
  365.                 Mov  Cl,[Si]                    ;Get The String Descriptor
  366.                 Jcxz Overwrite2                 ;Quit If Null
  367.                 Add  Dx,Cx                      ;Dx = Substr Endchar + 1
  368.                 Sub  Dl,Es:[Bx]                 ;Subtract String Length
  369.                 Cmp  Dl,1                       ;Will Substring Fit?
  370.                 Jg   Overwrite3                 ;If Not, Quit Routine
  371. Overwrite1:     Inc  Si                         ;Pt To Next Substrg Char
  372.                 Mov  Dl,[Si]                    ;Get The Char
  373.                 Mov  Es:[Di],Dl                 ;Insert Into The String
  374.                 Inc  Di                         ;Pt To Next Char Of Strx
  375.                 Loop Overwrite1                 ;Go Do Next Character
  376.                 Pop  Ds                         ;Restore Ds
  377.                 Jmp  Short Overwrite5           ;Terminate Without Error
  378. Overwrite2:     Mov  Al,1                       ;1 = Position Not In String
  379.                 Jmp  Short Overwrite4           ;Jump Ahead
  380. Overwrite3:     Mov  Al,2                       ;2 = Substring Won'T Fit
  381. Overwrite4:     Pop  Ds                         ;Restore Ds
  382.                 Mov  Errreturn,Al               ;Set Errreturn
  383. Overwrite5:     Pop  Bp                         ;Restore Bp And Quit
  384.                 Ret  10
  385. Overwrite Endp
  386.  
  387.  
  388. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  389. ;Procedure Padcentre(Var Strx: Stype; Ch: Char; Position,Length: Integer);
  390. ;
  391. ;
  392. Data    Segment
  393.         Extrn  Errreturn:Byte
  394. Data    Ends
  395. ;
  396. ;
  397. Padcentre Proc Far
  398.                 Push Bp                         ;Save Bp
  399.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  400.                 Mov  Errreturn,1                ;1 = Error
  401.                 Les  Di,Dword Ptr[Bp+12]        ;Es:Di Pts To Strx
  402.                 Mov  Si,Di                      ;Copy In Si
  403.                 Sub  Dx,Dx                      ;Clear Dx
  404.                 Mov  Dl,[Bp+6]                  ;New Strx Length In Dx (255 Max)
  405.                 Or   Dx,Dx                      ;Test For Zero Length
  406.                 Jz   Padcentre6                 ;Quit If Zero
  407.                 Mov  Bx,Dx                      ;Copy Of Length In Bx
  408.                 Sub  Cx,Cx                      ;Clear Cx
  409.                 Mov  Cl,Es:[Di]                 ;Get Current Strx Length
  410.                 Cmp  Cx,Dx                      ;Compare To New Length
  411.                 Jae  Padcentre6                 ;Quit If Longer
  412.                 Mov  Es:[Di],Dl                 ;Set New Strx Length
  413.                 Sub  Dx,Cx                      ;Dx = Number Pad Chars
  414.                 Sub  Ax,Ax                      ;Clear Ax
  415.                 Mov  Al,[Bp+8]                  ;Get Position
  416.                 Or   Ax,Ax                      ;Test For 0
  417.                 Jnz  Padcentre1                 ;Jump If Not 0
  418.                 Inc  Ax                         ;Else Make 1
  419. Padcentre1:     Cmp  Ax,Cx                      ;Past End Of String?
  420.                 Jna  Padcentre2                 ;Jump Ahead If Not
  421.                 Add  Di,Cx                      ;Offset To End Of Strx
  422.                 Jmp  Short Padcentre4           ;Go Write Pad Chars
  423. Padcentre2:     Add  Si,Bx                      ;Add To Target
  424.                 Add  Di,Bx                      ;Add To Source
  425.                 Sub  Di,Dx                      ;Source Minus Number Pad Chars
  426.                 Sub  Cx,Ax                      ;Subtract From Strx Len
  427.                 Inc  Cx                         ;Ax Pts From 0, Adjust
  428. Padcentre3:     Mov  Al,Es:[Di]                 ;Get A Char
  429.                 Mov  Es:[Si],Al                 ;Shift It Upwards
  430.                 Dec  Di                         ;Pull Back Source Ptr
  431.                 Dec  Si                         ;Target Ptr Too
  432.                 Loop Padcentre3                 ;Do Next Char
  433. Padcentre4:     Mov  Cx,Dx                      ;Number Pad Characters
  434.                 Mov  Al,[Bp+10]                 ;Get Pad Character
  435. Padcentre5:     Inc  Di                         ;Forward Ptr
  436.                 Mov  Es:[Di],Al                 ;Write Pad Character
  437.                 Loop Padcentre5                 ;Go Do The Next
  438.                 Dec  Errreturn                  ;0 = No Error
  439. Padcentre6:     Pop  Bp                         ;Restore Bp And Quit
  440.                 Ret  10
  441. Padcentre Endp
  442.  
  443.  
  444. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  445. ;Procedure Padends(Var Strx: Stype; Ch: Char; Length: Integer);
  446. ;
  447. ;
  448. Data    Segment
  449.         Extrn  Errreturn:Byte
  450. Data    Ends
  451. ;
  452. ;
  453. Padends Proc Far
  454.                 Push Bp                         ;Save Bp
  455.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  456.                 Mov  Errreturn,1                ;1 = Error
  457.                 Les  Di,Dword Ptr[Bp+10]        ;Es:Di Pts To Strx
  458.                 Mov  Si,Di                      ;Copy In Si
  459.                 Sub  Dx,Dx                      ;Clear Dx
  460.                 Mov  Dl,[Bp+6]                  ;New Strx Length In Dx
  461.                 Or   Dx,Dx                      ;Test For Zero Length
  462.                 Jz   Padends7                   ;Quit If Zero
  463.                 Sub  Cx,Cx                      ;Clear Cx
  464.                 Mov  Cl,Es:[Di]                 ;Get Strx Length
  465.                 Cmp  Cx,Dx                      ;Is Strx Gt New Length
  466.                 Jae  Padends7                   ;Quit If True
  467.                 Mov  Es:[Di],Dl                 ;Set New Strx Length
  468.                 Push Di                         ;Copy Of Start Of String
  469.                 Sub  Dx,Cx                      ;Dx = Number Pad Chars
  470.                 Mov  Bx,Dx                      ;Copy To Bx
  471.                 Shr  Bx,1                       ;Chars Div 2
  472.                 Sub  Dx,Bx                      ;Dx Is Same Or 1 Larger
  473.                 Add  Di,Cx                      ;Pt To End Of Strx
  474.                 Add  Si,Dx                      ;Offset For Upward Shift
  475.                 Add  Si,Cx                      ;Plus String Length
  476.                 Or   Cx,Cx                      ;Test For Null String
  477.                 Jnz  Padends1                   ;Jump Ahead If Not Null
  478.                 Sub  Bx,Bx                      ;
  479.                 Mov  Bl,[Bp+6]                  ;Otherwise Set At Right Padding
  480.                 Jmp Short Padends3              ;Jump To Rightside Padding
  481. Padends1:       Push Si                         ;Save End Position
  482. Padends2:       Mov  Al,Es:[Di]                 ;Get A Char
  483.                 Mov  Es:[Si],Al                 ;Shift It
  484.                 Dec  Di                         ;Dec Source Ptr
  485.                 Dec  Si                         ;Dec Target Ptr
  486.                 Loop Padends2                   ;Go Do Next
  487.                 Pop  Si                         ;Restore End Position
  488. Padends3:       Mov  Al,[Bp+8]                  ;Get The Pad Char
  489.                 Mov  Cx,Bx                      ;Number To Pad On Right
  490.                 Jcxz Padends5                   ;Jump Ahead If Zero
  491. Padends4:       Inc  Si                         ;Forward Ptr
  492.                 Mov  Es:[Si],Al                 ;Write Pad Char On Right
  493.                 Loop Padends4                   ;Go Do Next
  494. Padends5:       Pop  Di                         ;Di Pts To Bottom Of Strx
  495.                 Mov  Cx,Dx                      ;Number Pad Chars On Left
  496.                 Or   Cx,Cx                      ;Test For Zero
  497.                 Jz   Padends7                   ;Quit If Zero
  498. Padends6:       Inc  Di                         ;Forward Ptr
  499.                 Mov  Es:[Di],Al                 ;Write Pad Char On Left
  500.                 Loop Padends6                   ;Go Do Next
  501.                 Dec  Errreturn                  ;0 = No Error
  502. Padends7:       Pop  Bp                         ;Restore Bp And Quit
  503.                 Ret  8
  504. Padends Endp
  505.  
  506.  
  507.  
  508. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  509. ;Procedure Padleft(Var Strx: Stype; Ch: Char; Length: Integer);
  510. ;
  511. ;
  512. Data    Segment
  513.         Extrn  Errreturn:Byte
  514. Data    Ends
  515. ;
  516. ;
  517. Padleft Proc Far
  518.                 Push Bp                         ;Save Bp
  519.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  520.                 Mov  Errreturn,1                ;1 = Error
  521.                 Push Ds                         ;Save Ds
  522.                 Les  Di,Dword Ptr[Bp+10]        ;Get String Address
  523.                 Push Es                         ;Push Es...
  524.                 Pop  Ds                         ;...Then Load Into Ds
  525.                 Sub  Cx,Cx                      ;Clear Cx
  526.                 Mov  Cl,Es:[Di]                 ;String Length In Cl
  527.                 Mov  Bx,[Bp+6]                  ;New String Length In Bl
  528.                 Dec  Bx                         ;Dec Bx For Test
  529.                 Cmp  Bx,254                     ;In Range?
  530.                 Ja   Padleft2                   ;Quit If Not
  531.                 Inc  Bx                         ;Readjust
  532.                 Cmp  Cl,Bl                      ;Compare The Two Lengths
  533.                 Jae  Padleft2                   ;Quit If Old Len >= New
  534.                 Mov  Es:[Di],Bl                 ;Set New String Length
  535.                 Mov  Si,Di                      ;Pt Si To Descriptor
  536.                 Add  Si,Cx                      ;Now Pt Si To String End
  537.                 Add  Di,Bx                      ;Pt Di To New String End
  538.                 Sub  Bx,Cx                      ;Number Of Spaces To Pad
  539.                 Std                             ;Set Direction Flag
  540.                 Rep  Movsb                      ;Move Old String Right
  541.                 Mov  Cx,Bx                      ;Spaces To Pad In Cx
  542.                 Mov  Al,[Bp+8]                  ;Get Pad Character
  543. Padleft1:       Mov  [Di],Al                    ;Insert Pad Char
  544.                 Dec  Di                         ;Move To Next Position
  545.                 Loop Padleft1                   ;Go Do Next Char
  546.                 Pop  Ds                         ;Restore Ds
  547.                 Dec  Errreturn                  ;0 = No Error
  548.                 Jmp  Short Padleft3             ;Jump Ahead And Quit
  549. Padleft2:       Pop  Ds                         ;Exit With Error
  550. Padleft3:       Pop  Bp                         ;Restore Bp And Quit
  551.                 Ret  8
  552. Padleft Endp
  553.  
  554.  
  555.  
  556. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  557. ;Procedure Padright(Var Strx: Stype; Ch: Char; Length: Integer);
  558. ;
  559. ;
  560. Data    Segment
  561.         Extrn  Errreturn:Byte
  562. Data    Ends
  563. ;
  564. ;
  565. Padright Proc Far
  566.                 Push Bp                         ;Save Bp
  567.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  568.                 Mov  Errreturn,1                ;1 = Error
  569.                 Les  Di,Dword Ptr[Bp+10]        ;Get String Address
  570.                 Sub  Cx,Cx                      ;Clear Cx
  571.                 Mov  Cl,Es:[Di]                 ;String Length In Cl
  572.                 Mov  Bx,[Bp+6]                  ;New String Length
  573.                 Dec  Bx                         ;Dec Bx For Test
  574.                 Cmp  Bx,254                     ;In Range?
  575.                 Ja   Padright2                  ;Quit If Not
  576.                 Inc  Bx                         ;Readjust
  577.                 Cmp  Cl,Bl                      ;Compare The Two Lengths
  578.                 Jae  Padright2                  ;Quit If Old Len>=New Len
  579.                 Mov  Es:[Di],Bl                 ;Set New String Length
  580.                 Add  Di,Cx                      ;Point Di To End Of Strx
  581.                 Sub  Bx,Cx                      ;Sub Old Len From New Len
  582.                 Mov  Cx,Bx                      ;Use As Counter
  583.                 Mov  Al,[Bp+8]                  ;Get Pad Character
  584. Padright1:      Inc  Di                         ;Increment Pointer
  585.                 Mov  Es:[Di],Al                 ;Insert A Pad Char
  586.                 Loop Padright1                  ;Go Do Next Char
  587.                 Dec  Errreturn                  ;0 = No Error
  588. Padright2:      Pop  Bp                         ;Restore Bp And Quit
  589.                 Ret  8
  590. Padright Endp
  591.  
  592.  
  593. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  594. ;Procedure Replace(Var Strx: Stype; Substrg: Stype; Position,Chars: Integer);
  595. ;
  596. ;
  597. Data    Segment
  598.         Extrn  Errreturn:Byte
  599. Data    Ends
  600. ;
  601. ;
  602. Replace Proc Far
  603.                 Push Bp                         ;Save Bp
  604.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  605.                 Push Ds                         ;Save Ds Too
  606.                 Mov  Errreturn,1                ;1 = Error Has Occured
  607.                 Les  Di,Dword Ptr[Bp+14]        ;Es:Di Pts To Strx
  608.                 Sub  Cx,Cx                      ;Clear Cx
  609.                 Mov  Byte Ptr[Bp+7],Cl          ;Use Byte As If Word
  610.                 Mov  Cl,Es:[Di]                 ;Get Strx Length
  611.                 Or   Cx,Cx                      ;Test For Null String
  612.                 Jnz  Replace2                   ;Jump Ahead If Not
  613. Replace1:       Jmp  Replace9                   ;Else Quit Routine
  614. Replace2:       Sub  Bx,Bx                      ;Clear Bx
  615.                 Mov  Bl,[Bp+8]                  ;Position To Bx
  616.                 Or   Bx,Bx                      ;Position 0?
  617.                 Jz   Replace1                   ;Quit If Zero
  618.                 Cmp  Bx,Cx                      ;Within Strx?
  619.                 Jnbe Replace1                   ;Quit If Not
  620.                 Lds  Si,Dword Ptr[Bp+10]        ;Ds:Si Pts To Substrg
  621.                 Sub  Dx,Dx                      ;Clear Dx
  622.                 Mov  Dl,[Si]                    ;Substring Length
  623.                 Or   Dx,Dx                      ;Test For Null
  624.                 Jz   Replace1                   ;Quit If Null
  625.                 Mov  Ax,Cx                      ;Strx Length
  626.                 Sub  Ax,Bx                      ;Minus Position
  627.                 Inc  Ax                         ;Number Deletable Chars
  628.                 Cmp  Ax,[Bp+6]                  ;Cmp To Num Chars To Del
  629.                 Jb   Replace9                   ;Quit If Not Enough Chars
  630.                 Mov  Ax,[Bp+6]                  ;Chars To Delete
  631.                 Cmp  Ax,Dx                      ;Num Chars Del/Replace
  632.                 Ja   Replace3                   ;Must Shift Chars Down
  633.                 Jb   Replace5                   ;Must Shift Chars Up
  634.                 Add  Di,Bx                      ;No Shift, Di To Overlay
  635.                 Jmp  Short Replace7             ;No Write Substring
  636. Replace3:       Sub  Ax,Dx                      ;Strx Shortened This Much
  637.                 Sub  Cx,Ax                      ;New String Length
  638.                 Mov  Es:[Di],Cl                 ;Set Descriptor
  639.                 Add  Di,Bx                      ;Pt To Substrg Position
  640.                 Mov  Si,Di                      ;Copy To Si
  641.                 Add  Si,Dx                      ;Pt To End Of Substrg + 1
  642.                 Sub  Cx,Bx                      ;Chars Following Substrg
  643.                 Inc  Cx                         ;Adjust
  644.                 Mov  Bx,Si                      ;End Of Substring Pos
  645.                 Add  Bx,Ax                      ;Forward To Shift Point
  646. Replace4:       Mov  Al,Es:[Bx]                 ;Get A Char
  647.                 Mov  Es:[Si],Al                 ;Move It Downward
  648.                 Inc  Si                         ;Inc Target Ptr
  649.                 Inc  Bx                         ;Inc Source Ptr
  650.                 Loop Replace4                   ;Loop Till Finished
  651.                 Jmp  Short Replace7             ;Go Write Substring
  652. Replace5:       Neg  Ax                         ;Dx Minus Ax In Ax
  653.                 Add  Ax,Dx                      ;Ax = Increased Strx Len
  654.                 Add  Cx,Ax                      ;New Length
  655.                 Mov  Es:[Di],Cl                 ;Set Descriptor
  656.                 Mov  Si,Di                      ;Si Pts To Start Of Strx
  657.                 Add  Di,Bx                      ;Point Di To Substrg Pos
  658.                 Add  Si,Cx                      ;Si Pts To End Of Strx
  659.                 Mov  Bx,Si                      ;Copy To Bx
  660.                 Sub  Bx,Ax                      ;Move To Shift Point
  661.                 Sub  Cx,[Bp+8]                  ;Length Minus Position
  662.                 Dec  Cx                         ;Adjust
  663.                 Jcxz Replace7                   ;Boundary Case
  664. Replace6:       Mov  Al,Es:[Bx]                 ;Get A Character
  665.                 Mov  Es:[Si],Al                 ;Move It Upwards
  666.                 Dec  Si                         ;Dec Target Ptr
  667.                 Dec  Bx                         ;Get Source Ptr
  668.                 Loop Replace6                   ;Loop Till Finished
  669. Replace7:       Lds  Si,Dword Ptr[Bp+10]        ;Point Ds:Si Back To Substrg
  670.                 Inc  Si                         ;Forward Si To First Char
  671. Replace8:       Mov  Cl,[Si]                    ;Get Char From Substring
  672.                 Mov  Es:[Di],Cl                 ;Move To Strx
  673.                 Inc  Si                         ;Forward Source Ptr
  674.                 Inc  Di                         ;Forward Target Ptr
  675.                 Dec  Dx                         ;Dec Substring Ctr
  676.                 Jnz  Replace8                   ;Loop Till Finished
  677.                 Pop  Ds                         ;Restore Ds
  678.                 Dec  Errreturn                  ;0 = No Error
  679.                 Jmp  Short Replace10            ;Jump Ahead
  680. Replace9:       Pop  Ds                         ;Terminate With Error
  681. Replace10:      Pop  Bp                         ;Restore Bp And Quit
  682.                 Ret  12
  683. Replace Endp
  684.  
  685.  
  686. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  687. ;Function Rightend(Var Strx: Stype; Border: Char): Stype;
  688. ;
  689. ;
  690. Data    Segment
  691.         Extrn  Errreturn:Byte
  692. Data    Ends
  693. ;
  694. ;
  695. Rightend Proc Far
  696.                 Push Bp                         ;Save Bp
  697.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  698.                 Push Ds                         ;Save Ds
  699.                 Mov  Dl,1                       ;1 = Border Char Not Found
  700.                 Les  Di,Dword Ptr[Bp+8]         ;Es:Di Pts To Strx
  701.                 Sub  Cx,Cx                      ;Clear Cx
  702.                 Mov  Cl,Es:[Di]                 ;String Length To Cx
  703.                 Jcxz Rightend2                  ;Quit If Zero
  704.                 Add  Di,Cx                      ;Pt To Last Byte Of Strx
  705.                 Mov  Si,Di                      ;Copy Start Position
  706.                 Std                             ;Direction Flag Backward
  707.                 Mov  Al,[Bp+6]                  ;Border Character
  708.                 Repne Scasb                     ;Search For The Character
  709.                 Jnz  Rightend1                  ;Skip Inc If Not Found
  710.                 Inc  Di                         ;Discard Border Char
  711.                 Dec  Dl                         ;Errreturn = 0, No Error
  712. Rightend1:      Inc  Di                         ;Step Pointer Back
  713.                 Sub  Si,Di                      ;Figure Number Characters
  714.                 Inc  Si                         ;Adjust
  715.                 Mov  Cx,Si                      ;Use As Counter
  716.                 Mov  Ax,Es                      ;Transfer Es...
  717.                 Mov  Ds,Ax                      ;To Ds
  718.                 Mov  Si,Di                      ;Ds:Si Pts To Strx
  719. Rightend2:      Les  Di,Dword Ptr[Bp+12]        ;Now Es:Di Pts To Return String
  720.                 Mov  Es:[Di],Cl                 ;Set Return Descriptor
  721.                 Jcxz Rightend3                  ;Jump Ahead If Null Strx
  722.                 Inc  Di                         ;Forward Ptr
  723.                 Cld                             ;Direction Flag Forward
  724.                 Rep  Movsb                      ;Move The String
  725. Rightend3:      Pop  Ds                         ;Restore Ds
  726.                 Mov  Errreturn,Dl               ;Set Errreturn
  727.                 Pop  Bp                         ;Restore Bp And Quit
  728.                 Ret  6
  729. Rightend Endp
  730.  
  731.  
  732.  
  733.  
  734. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  735. ;Function Seekstring(Strx,Substrg: Stype; Startpt: Integer):Integer;
  736. ;
  737. ;
  738. Data    Segment
  739.         Extrn  Errreturn:Byte
  740. Data    Ends
  741. ;
  742. ;
  743. Seekstring Proc Far
  744.                 Push Bp                         ;Save Bp
  745.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  746.                 Push Ds                         ;Save Turbo'S Ds
  747.                 Lds  Si,Dword Ptr[Bp+12]        ;Ds:Si Pts To Strx
  748.                 Les  Di,Dword Ptr[Bp+8]         ;Ds:Di Pts To Substrg
  749.                 Sub  Cx,Cx                      ;Clear Cx
  750.                 Mov  Cl,[Bp+6]                  ;Get Startpt
  751.                 Mov  Bp,1                       ;1 = Startpt Out Of Range
  752.                 Jcxz Seekstring11               ;Quit If Zero
  753.                 Mov  Dl,Es:[Di]                 ;Substr Length In Dl
  754.                 Inc  Di                         ;Di Pts 1St Chr Of Substr
  755.                 Inc  Bp                         ;2 = Substrg Is Null
  756.                 Or   Dl,Dl                      ;Substr Length Non-Zero?
  757.                 Jnz  Seekstring21               ;Continue If So
  758. Seekstring11:   Jmp  Seekstring1                ;Error: Quit Routine
  759. Seekstring21:   Mov  Dh,[Si]                    ;Strx Length In Dh
  760.                 Dec  Bp                         ;1 = Strx Is Null
  761.                 Or   Dh,Dh                      ;Test For Null
  762.                 Jz   Seekstring11               ;Quit If Null
  763.                 Mov  Bl,Cl                      ;Startpt
  764.                 Add  Bl,Dl                      ;Substrg Length
  765.                 Dec  Bl                         ;Adjust
  766.                 Cmp  Bl,Dh                      ;Compare To Strx Length
  767.                 Ja   Seekstring11               ;Quit If Out Of Range
  768.                 Mov  Bp,0                       ;0 = No Error
  769.                 Mov  Bl,Cl                      ;Startpt To Pos Counter
  770.                 Dec  Bl                         ;Adjust
  771.                 Sub  Dh,Cl                      ;Sub From Search Len
  772.                 Inc  Dh                         ;Adjust
  773.                 Add  Si,Cx                      ;Begin Search At Startpt
  774. Seekstring31:   Mov  Al,Es:[Di]                 ;Get Char From Of Substr
  775.                 Mov  Ah,Al                      ;Copy In Ah
  776.                 Cmp  Al,97                      ;Low End Of Lower Case
  777.                 Jb   Seekstring41               ;Jump If Below
  778.                 Cmp  Al,122                     ;Upper End Of Lower Case
  779.                 Ja   Seekstring51               ;Neither Upper Nor Lower
  780.                 Sub  Ah,32                      ;Make Ah Upper Case
  781.                 Jmp  Short Seekstring51         ;Go Test Both
  782. Seekstring41:   Cmp  Al,65                      ;Low End Of Upper Case
  783.                 Jb   Seekstring51               ;Neither Upper Nor Lower
  784.                 Cmp  Al,90                      ;High End Of Upper Case
  785.                 Ja   Seekstring51               ;Neither Upper Nor Lower
  786.                 Add  Ah,32                      ;Make Ah Lower Case
  787. Seekstring51:   Inc  Bl                         ;Inc Strx Pos Counter
  788.                 Or   Dh,Dh                      ;Counter = Zero?
  789.                 Jz   Seekstring111              ;Quit If So
  790.                 Dec  Dh                         ;Dec Length Counter
  791.                 Mov  Bh,[Si]                    ;Get Char From Strx
  792.                 Cmp  Bh,Al                      ;Test For Match
  793.                 Je   Seekstring61               ;Jump If Found
  794.                 Cmp  Bh,Ah                      ;2Nd Test For Match
  795.                 Je   Seekstring61               ;Jump If Found
  796.                 Inc  Si                         ;Forward Strx Ptr
  797.                 Jmp  Short Seekstring51         ;Go Check Next Char
  798. Seekstring61:   Cmp  Dl,1                       ;Single Char Substring?
  799.                 Je   Seekstring1                ;If So, Not A Match
  800.                 Sub  Cx,Cx                      ;Clear Cx
  801.                 Mov  Cl,Dl                      ;Cx = Substr Length
  802.                 Dec  Cl                         ;1St Char Already Matched
  803.                 Push Si                         ;Save Strx Position
  804.                 Push Di                         ;Save Substr Position
  805. Seekstring71:   Inc  Si                         ;Pt To Nxt Char Of Strx
  806.                 Inc  Di                         ;Pt To Nxt Char Of Substr
  807.                 Mov  Al,Es:[Di]                 ;Get Char From Of Substr
  808.                 Mov  Ah,Al                      ;Copy In Ah
  809.                 Cmp  Al,97                      ;Low End Of Lower Case
  810.                 Jb   Seekstring81               ;Jump If Below
  811.                 Cmp  Al,122                     ;Upper End Of Lower Case
  812.                 Ja   Seekstring91               ;Neither Upper Nor Lower
  813.                 Sub  Ah,32                      ;Make Ah Upper Case
  814.                 Jmp  Short Seekstring91         ;Go Test Both
  815. Seekstring81:   Cmp  Al,65                      ;Low End Of Upper Case
  816.                 Jb   Seekstring91               ;Neither Upper Nor Lower
  817.                 Cmp  Al,90                      ;High End Of Upper Case
  818.                 Ja   Seekstring91               ;Neither Upper Nor Lower
  819.                 Add  Ah,32                      ;Make Ah Lower Case
  820. Seekstring91:   Mov  Bh,[Si]                    ;Get Char From Strx
  821.                 Cmp  Bh,Al                      ;Test For Match
  822.                 Je   Seekstring101              ;Jump If Found
  823.                 Cmp  Bh,Ah                      ;2Nd Test For Match
  824.                 Je   Seekstring101              ;Jump If Found
  825.                 Pop  Di                         ;Match Not Made
  826.                 Pop  Si                         ;Restore Prior Ptrs
  827.                 Inc  Si                         ;Forward Strx Ptr
  828.                 Jmp  Short Seekstring31         ;Resume Search For 1St Ch
  829. Seekstring101:  Loop Seekstring71               ;Go Compare Next Char
  830.                 Pop  Di                         ;Substring Found!
  831.                 Pop  Si                         ;Balance Stack
  832.                 Jmp  Short Seekstring1          ;Go Set Return Value
  833. Seekstring111:  Sub  Bl,Bl                      ;Return 0
  834. Seekstring1:    Sub  Bh,Bh                      ;Return In Bl, Clear Bh
  835.                 Mov  Ax,Bx                      ;Set Return Value
  836.                 Pop  Ds                         ;Restore Ds
  837.                 Mov  Bx,Bp                      ;Get Return Value
  838.                 Mov  Errreturn,Bl               ;Set Errreturn
  839.                 Pop  Bp                         ;Restore Bp And Quit
  840.                 Ret  10
  841. Seekstring Endp
  842.  
  843.  
  844. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  845. ;Function Stringof(Substrg: Stype; Length: Integer): Stype;
  846. ;
  847. ;
  848. Data    Segment
  849.         Extrn Errreturn:Byte
  850. Data    Ends
  851. ;
  852. Stringof Proc Far
  853.                 Push Bp                         ;Save Bp
  854.                 Mov  Bp,Sp                      ;Set Up Stack Frame
  855.                 Mov  Errreturn,1                ;1 = Error
  856.                 Push Ds                         ;Save Ds
  857.                 Les  Di,Dword Ptr[Bp+12]        ;Es:Di Pts To Return String
  858.                 Lds  Si,Dword Ptr[Bp+8]         ;Ds:Si Pts To Substring
  859.                 Mov  Byte Ptr Es:[Di],0         ;Return Null String If Error
  860.                 Mov  Cx,[Bp+6]                  ;Return String Length
  861.                 Jcxz Stringof3                  ;Quit If Null
  862.                 Sub  Ch,Ch                      ;255 Max
  863.                 Mov  Dl,[Si]                    ;Get Substring Length
  864.                 Mov  Dh,Dl                      ;Copy In Dh
  865.                 Or   Dl,Dl                      ;Test For Zero Length
  866.                 Jz   Stringof3                  ;Quit If Zero
  867.                 Mov  Es:[Di],Cl                 ;Set Return Strx Descriptor
  868.                 Mov  Bx,Si                      ;Copy Strx Start Point
  869. Stringof1:      Inc  Di                         ;Forward Ret Strx Ptr
  870.                 Inc  Si                         ;Forward Strx Ptr
  871.                 Mov  Al,[Si]                    ;Get Character
  872.                 Mov  Es:[Di],Al                 ;Write Character
  873.                 Dec  Cx                         ;Finished Yet?
  874.                 Jz   Stringof2                  ;Quit If So
  875.                 Dec  Dl                         ;End Of Strx Yet?
  876.                 Jnz  Stringof1                  ;Loop If Not
  877.                 Mov  Dl,Dh                      ;Renew Strx Counter
  878.                 Mov  Si,Bx                      ;Si Back To Start Of Strx
  879.                 Jmp  Short Stringof1            ;Go Start Strx Again
  880. Stringof2:      Pop  Ds                         ;Restore Ds
  881.                 Dec  Errreturn                  ;0 = No Error
  882.                 Jmp  Short Stringof4            ;Jump Ahead
  883. Stringof3:      Pop  Ds                         ;Terminate With Error
  884. Stringof4:      Pop  Bp                         ;Restore Bp And Quit
  885.                 Ret  6
  886. Stringof Endp
  887.  
  888. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  889. ;Procedure Uppercase(Var Strx: Stype);
  890. ;
  891. ;
  892. Uppercase Proc Far
  893.                 Mov  Bx,Sp                      ;Bx Points To Stack
  894.                 Les  Di,Ss:Dword Ptr[Bx+4]      ;Es:Di Pts To String
  895.                 Sub  Cx,Cx                      ;Clear Cx
  896.                 Mov  Cl,Es:[Di]                 ;Get String Length
  897.                 Jcxz Uppercase3                 ;Quit If Null
  898. Uppercase1:     Inc  Di                         ;Pt To Next Char Of Strx
  899.                 Cmp  Es:Byte Ptr [Di],'Z'       ;Test High Char
  900.                 Ja   Uppercase2                 ;Skip Ahead If Above
  901.                 Cmp  Es:Byte Ptr [Di],'A'       ;Test Low Char
  902.                 Jb   Uppercase2                 ;Skip Ahead If Below
  903.                 Sub  Es:Byte Ptr [Di],32        ;Change The Char
  904. Uppercase2:     Loop Uppercase1                 ;Go Test Next Character
  905. Uppercase3:     Ret  4
  906. Uppercase Endp
  907.  
  908. ;=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
  909. ;Function Wordcount(Strx: Stype): Integer;
  910. ;
  911. ;
  912. Wordcount Proc Far
  913.                 Mov  Bx,Sp                      ;Bx Points To Stack
  914.                 Les  Di,Ss:Dword Ptr[Bx+4]      ;Point Es:Di To String
  915.                 Sub  Dx,Dx                      ;Clear Dx As Counter
  916.                 Mov  Cx,Dx                      ;Clear Cx
  917.                 Mov  Cl,Es:[Di]                 ;Get String Descriptor
  918.                 Mov  Al,32                      ;Al Holds Space Char
  919. Wordcount1:     Jcxz Wordcount3                 ;Jump Ahead At Eol
  920.                 Inc  Di                         ;Forward Pointer
  921.                 Dec  Cx                         ;Dec Strx Counter
  922.                 Cmp  Es:[Di],Al                 ;Char A Space?
  923.                 Je   Wordcount1                 ;Loop If So
  924.                 Inc  Dx                         ;Word Starts -- Inc Ctr
  925. Wordcount2:     Jcxz Wordcount3                 ;Jump Ahead At Eol
  926.                 Inc  Di                         ;Forward Pointer
  927.                 Dec  Cx                         ;Dec Strx Counter
  928.                 Cmp  Es:[Di],Al                 ;Char A Space?
  929.                 Je   Wordcount1                 ;Back To Spc Loop If So
  930.                 Jmp  Short Wordcount2           ;Else Next Word Char
  931. Wordcount3:     Mov  Ax,Dx                      ;Set Return Value
  932.                 Ret  4
  933. Wordcount Endp
  934.  
  935.  
  936.  
  937. Code    Ends
  938.  
  939.         End
  940.  
  941.  
  942.  
  943.