home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / dos / diverses / cexpress / strings / expndtab.asm < prev    next >
Encoding:
Assembly Source File  |  1989-05-03  |  2.7 KB  |  90 lines

  1. ;void  expand_tabs(strg,return_strg,max_length);
  2. ;  char  *strg,*return_strg;
  3. ;  unsigned short   max_length;
  4.  
  5.     EXTRN  _memory_model:byte
  6.     EXTRN  _error_code:byte
  7.  
  8. _TEXT    SEGMENT BYTE PUBLIC 'CODE'
  9.     ASSUME CS:_TEXT
  10.     PUBLIC _expand_tabs
  11. _expand_tabs proc near
  12.     push bp            ;
  13.     mov  bp,sp        ;
  14.     push di            ;
  15.     push si            ;
  16.     push ds            ;
  17.     cmp  _memory_model,0    ;near or far?
  18.     jle  begin        ;jump if near
  19.     inc  bp            ;else add 2 to BP
  20.     inc  bp            ;
  21. begin:    cmp  _memory_model,2    ;data near or far?
  22.     jb   L0            ;jump if near    
  23.     lds  si,dword ptr[bp+4] ;DS:SI pts to Strg
  24.     les  di,dword ptr[bp+8] ;ES:DI pts to return strg
  25.     mov  ax,[bp+12]        ;max_length to al
  26.     jmp  short L00        ;jump ahead
  27. L0:    mov  ax,ds        ;near case
  28.     mov  es,ax        ;ES = DS
  29.     mov  si,[bp+4]        ;    
  30.     mov  di,[bp+6]        ;
  31.     mov  ax,[bp+8]        ;
  32. L00:    mov  byte ptr es:[di],0    ;return null string if error
  33.     mov  bl,2        ;error_code 2 = null string or strg>max_length
  34.     or   ax,ax        ;test for zero max_length
  35.     jz   L8            ;quit if zero
  36.     push si            ;must find string length
  37.     sub  cx,cx        ;cx counts
  38. L1:    cmp  byte ptr[si],0    ;end of string?
  39.     je   L2            ;quit loop when so
  40.     inc  cx            ;else inc counter
  41.     inc  si            ;forward ptr
  42.     jmp  short L1        ;loop
  43. L2:    pop  si            ;restore pointer to start of string
  44.     jcxz L8            ;quit if null string
  45.     sub  ax,cx        ;max_length minus strg len
  46.     cmp  ax,0        ;test 
  47.     jl   L8            ;quit if Strg won't fit
  48.     dec  bl            ;error_code 1 = no tab chars found
  49.     mov  dh,al        ;DH cts available spaces
  50.     mov  dl,8        ;initial tab column ptr
  51.     dec  di            ;pull back DI, since inc'ed in loop ahead
  52.     dec  si            ;same for SI
  53. L3:    inc  si            ;forward strg ptr
  54.     inc  di            ;forward return strg ptr
  55.     dec  dl            ;dec tab column ptr
  56.     mov  al,[si]        ;get a character
  57.     cmp  al,9        ;is it a tab?
  58.     jne  L5            ;jump ahead if not
  59.     mov  bl,0        ;error_code 0 = at least 1 tab char found
  60. L4:    mov  byte ptr es:[di],32 ;write space
  61.     or   dl,dl        ;at tab column?
  62.     jz   L6            ;next char if not
  63.     or   dh,dh        ;extra space available?
  64.     jz   L6            ;leave loop if not
  65.     dec  dh            ;else dec space counter
  66.     dec  dl            ;dec tab column ptr
  67.     inc  di            ;forward ptr
  68.     jmp  short L4        ;go write another space
  69. L5:    mov  es:[di],al        ;move to return string
  70.     inc  ch            ;inc ret string len ctr
  71.     or   dl,dl        ;test tab column ptr
  72.     jnz  L7            ;jump ahead if not 0
  73. L6:    mov  dl,8        ;restore ctr to 8
  74. L7:    dec  cl            ;dec string length ctr
  75.     jnz  L3            ;loop till finished
  76.     inc  di            ;forward return string pointer
  77.     mov  byte ptr es:[di],0    ;set terminator
  78. L8:    pop  ds            ;restore DS
  79.     mov  _error_code,bl    ;set _error_code and quit
  80.     pop  si            ;
  81.     pop  di            ;
  82.     pop  bp            ;
  83.     cmp  _memory_model,0    ;quit
  84.     jle  quit        ;
  85.     db   0CBh        ;RET far
  86. quit:    ret            ;RET near
  87. _expand_tabs ENDP
  88. _TEXT    ENDS
  89.     END
  90.