home *** CD-ROM | disk | FTP | other *** search
/ Piper's Pit BBS/FTP: ibm 0000 - 0009 / ibm0000-0009 / ibm0003.tar / ibm0003 / TPOWER53.ZIP / TPASM.ARC / TPTAB.ASM < prev    next >
Encoding:
Assembly Source File  |  1989-07-10  |  5.1 KB  |  178 lines

  1. ;******************************************************
  2. ;           TPTAB.ASM 5.07
  3. ;           String handling routines
  4. ;     Copyright (c) TurboPower Software 1987.
  5. ; Portions copyright (c) Sunny Hill Software 1985, 1986
  6. ;     and used under license to    TurboPower Software
  7. ;         All rights reserved.
  8. ;******************************************************
  9.  
  10.     INCLUDE    TPCOMMON.ASM
  11.  
  12. ;******************************************************    Code
  13.  
  14. CODE    SEGMENT    BYTE PUBLIC
  15.  
  16.     ASSUME    CS:CODE
  17.  
  18.     PUBLIC    Entab, Detab
  19.  
  20. ;******************************************************    Entab
  21.  
  22. ;  function Entab(S : string; TabSize :    Byte) :    string;
  23. ;    {-Convert blanks in a string to tabs on spacing TabSize}
  24.  
  25. RS           EQU DWORD PTR [BP+12]    ;Result    string
  26. TS           EQU DWORD PTR [BP+8]    ;Input string
  27. TabSize           EQU BYTE    PTR  [BP+6]    ;TabSize
  28.  
  29. Entab    PROC   FAR
  30.  
  31.     StackFrameBP
  32.     PUSH   DS
  33.     CLD
  34.  
  35.     XOR    BX,BX            ;Initial SpaceCount = 0
  36.     XOR    CX,CX            ;Default input length =    0
  37.     XOR    DX,DX            ;Default output    length = 0 in DL
  38.     MOV    DH,TabSize        ;DH will hold TabSize
  39.  
  40.     LDS    SI,TS            ;DS:SI => input    string
  41.     LES    DI,RS            ;ES:DI => output string
  42.     LODSB                ;Get input length
  43.     OR     DH,DH            ;TabSize = 0?
  44.     JNZ    ETDefLength
  45.     XOR    AL,AL            ;Return    zero length string if TabSize =    0
  46. ETDefLength:
  47.     MOV    CL,AL            ;Store length in counter
  48.     STOSB                ;Store default output length
  49.     JCXZ   ETdone            ;Done if empty input string
  50.  
  51.     INC    CH            ;Current input position=1
  52.  
  53. ETNext:    OR     BL,BL            ;Compare SpaceCount to 0
  54.     JE     ETNoTab            ;If SpaceCount=0 then no tab insert here
  55.     MOV    AL,CH            ;Ipos to AL
  56.     XOR    AH,AH            ;AX has    Ipos
  57.     DIV    DH            ;Ipos DIV TabSize
  58.     CMP    AH,1            ;Ipos MOD TabSize = 1 ?
  59.     JNE    ETNoTab            ;If not, no tab    insert here
  60.     SUB    DL,BL            ;Reduce    Olen by    SpaceCount
  61.     SUB    DI,BX            ;Remove    unused characters from output string
  62.     MOV    AL,09
  63.     STOSB                ;Store a tab
  64.     INC    DL            ;Add one to output length
  65.     XOR    BL,BL            ;Reset SpaceCount
  66. ETNoTab:
  67.     LODSB                ;Get next input    character
  68.     INC    BL            ;Increment SpaceCount
  69.     CMP    AL,32            ;Is character a    space?
  70.     JZ     ETstore            ;Yes, store it for now
  71.     XOR    BL,BL            ;Reset SpaceCount
  72.     CMP    AL,39            ;Is it a quote?
  73.     JZ     ETquotes            ;Yep, enter quote loop
  74.     CMP    AL,34            ;Is it a doublequote?
  75.     JNZ    ETstore            ;Nope, store it
  76.  
  77. ETquotes:
  78.     MOV    AH,AL            ;Save quote start
  79. ETnextQ:
  80.     STOSB                ;Store quoted character
  81.     INC    DL            ;Increment output length
  82.     LODSB                ;Get next character
  83.     INC    CH            ;Increment Ipos
  84.     CMP    CH,CL            ;At end    of line?
  85.     JAE    ETstore            ;If so,    exit quote loop
  86.     CMP    AL,AH            ;Matching end quote?
  87.     JNZ    ETnextQ            ;Nope, stay in quote loop
  88.     CMP    AL,39            ;Single    quote?
  89.     JZ     ETstore            ;Exit quote loop
  90.     CMP    BYTE PTR    [SI-2],'\'    ;Previous character an escape?
  91.     JZ     ETnextQ            ;Stay in if so
  92.  
  93. ETstore:
  94.     STOSB                ;Store last character
  95.     INC    DL            ;Increment output length
  96.     INC    CH            ;Increment input position
  97.     JZ     ETstoreLen        ;Exit if past 255
  98.     CMP    CH,CL            ;Compare Ipos to Ilen
  99.     JBE    ETNext            ;Repeat    while characters left
  100.  
  101. ETstoreLen:
  102.     LES    DI,RS            ;ES:DI => output string
  103.     MOV    ES:[DI],DL        ;Store final length
  104.  
  105. ETdone:
  106.     POP    DS
  107.     ExitCode 6            ;Leave result pointer on stack
  108.  
  109. Entab    ENDP
  110.  
  111. ;******************************************************    Detab
  112.  
  113. ;  function Detab(S : string; TabSize :    Byte) :    string;
  114. ;    {-Expand tabs in a    string to blanks on spacing TabSize}
  115.  
  116. Detab    PROC   FAR
  117.  
  118.     StackFrameBP
  119.     PUSH   DS
  120.     CLD
  121.  
  122.     XOR    CX,CX            ;Default input length =    0
  123.     XOR    DX,DX            ;Default output    length = 0 in DL
  124.     MOV    DH,TabSize        ;DH will hold TabSize
  125.  
  126.     LDS    SI,TS            ;DS:SI => input    string
  127.     LES    DI,RS            ;ES:DI => output string
  128.     LODSB                ;Get input length
  129.     OR     DH,DH            ;TabSize = 0?
  130.     JNZ    DTDefLength
  131.     XOR    AL,AL            ;Return    zero length string if TabSize =    0
  132. DTDefLength:
  133.     MOV    CL,AL            ;Store length in counter
  134.     STOSB                ;Store default output length
  135.     JCXZ   DTdone            ;Done if empty input string
  136.  
  137.     MOV    AH,09            ;Store tab in AH
  138.     MOV    BL,255            ;Maximum length    of output
  139.  
  140. DTNext:    LODSB                ;Next input character
  141.     CMP    AL,AH            ;Is it a tab?
  142.     JE     DTTab            ;Yes, compute next tab stop
  143.     STOSB                ;No, store to output
  144.     INC    DL            ;Increment output length
  145.     CMP    DL,BL            ;255 characters    max
  146.     LOOPNE DTNext            ;Next character    while Olen <= 255
  147.     JMP SHORT DTStoreLen        ;Loop termination
  148.  
  149. DTTab:    MOV    BH,CL            ;Save input counter
  150.     MOV    AL,DL            ;Current output    length in AL
  151.     XOR    AH,AH            ;Clear top byte
  152.     DIV    DH            ;OLen DIV TabSize in AL
  153.     INC    AL            ;Round up to next tab position
  154.     MUL    DH            ;Next tab position in AX
  155.     OR     AH,AH            ;AX > 255?
  156.     JNE    DTStoreLen        ;Can't store it
  157.     SUB    AL,DL            ;Count of blanks to insert
  158.     ADD    DL,AL            ;New output length in DL
  159.     MOV    CL,AL            ;Loop counter for blanks
  160.     MOV    AX,0920h            ;Tab in    AH, Blank in AL
  161.     REP    STOSB            ;Store blanks
  162.     MOV    CL,BH            ;Restore input position
  163.     LOOP   DTNext            ;Back for next input
  164.  
  165. DTStoreLen:
  166.     LES    DI,RS            ;ES:DI => output string
  167.     MOV    ES:[DI],DL        ;Store final length
  168.  
  169. DTDone:    POP    DS
  170.     ExitCode 6            ;Leave result pointer on stack
  171.  
  172. Detab    ENDP
  173.  
  174.  
  175. CODE    ENDS
  176.  
  177.     END
  178.