home *** CD-ROM | disk | FTP | other *** search
/ Amiga Elysian Archive / AmigaElysianArchive.iso / printer / deskjet_.lha / RemAnsi.rexx < prev    next >
OS/2 REXX Batch file  |  1992-10-03  |  7KB  |  175 lines

  1. /* remove any (Amiga / ANSI-)control codes from the textfile */
  2. /*       ^^^^^ should remove a superset of these, hopefully ... */ 
  3.  
  4. /* remove 00..07,0b,0d..1f,7f..9f,ff */
  5. /* optionally replace 0c by 0a (formfeed by linefeed) */
  6. /* optionally remove  08 and one(!) of its neighbours */
  7. /*   to remove 'typewriterlike-doublestrike/underlining */
  8.  
  9. /* PS: NEVER USE A HP PC8 TEXT as INPUT -> some chars (UMLAUTS !) are removed ! */
  10.  
  11. /*
  12. Peter Jakobi, Munich, Oct. 2, 1992
  13. jakobi@informatik.tu-muenchen.de
  14. lazarus@salyko.doit.cubenet.org
  15. */
  16.  
  17. parse upper arg infile outfile options                              /* open the files ... */
  18.  
  19. IF infile='?' THEN DO
  20.    say 'REMANSI.rexx <infile> <outfile> <options>'
  21.    say 'Remansi removes any control codes or ESC/CSI sequences from the inputfile.'
  22.    say 'Options: noff   remove format feeds'
  23.    say '         nobs   remove any BS from the text (double striked titles, ...)'
  24.    say 'You may want to filter the output with stripbin ... '
  25.    EXIT 1
  26. END
  27.  
  28. /* GLOBAL VAR: VAL CHAR */
  29.  
  30. /* options */
  31.  
  32. IF index(' 'options' ',' NOFF ')>0 THEN noff=1 
  33. ELSE noff=0
  34. IF index(' 'options' ',' NOBS ')>0 THEN nobs=1 
  35. ELSE nobs=0
  36.  
  37.  
  38.  
  39. IF open(infh,infile,'R')=0 THEN EXIT 5
  40. IF open(outfh,outfile,'W')=0 THEN EXIT 5
  41.  
  42. ESC='1b'x  /* remove */
  43. CSI='9b'x  /* remove */
  44. BS ='08'x  /* remove ? */
  45. FF ='0c'x  /* remove ? */
  46. DEL='ff'x  /* remove */
  47.  
  48. match =        '1B9B 0001 0203 0405 0607 0b0d 0e0f 1011 1213 1415 1617 1819 1a1c 1d1e 1fff'
  49. match = match||'7f80 8182 8384 8586 8788 898a 8b8c 8d8e 8f90 9192 9394 9596 9798 999a 9c9d 9e9f'
  50.  
  51. match=x2c(match)
  52. IF nobs THEN match=match||BS
  53. IF noff THEN match=match||FF
  54.  
  55. inputsize=1000
  56. i=1       /* inputbuffer pointer */
  57. out=''     /* output buffer */
  58.  
  59. IF readblock()=0 THEN SIGNAL done
  60. DO FOREVER
  61.    IF i=0 THEN SIGNAL done
  62.    IF inputsize=0 THEN SIGNAL done
  63.    rest=substr(line,i)
  64.    j=verify(rest,match,'M')
  65.    IF j=0 THEN DO 
  66.       out=out||rest
  67.       IF readblock()=0 THEN SIGNAL done
  68.    END
  69.    ELSE DO
  70.       out=out||substr(line,i,j-1) 
  71.       i=j+i-1
  72.       call getchar()
  73.       SELECT                                                        /* to what CLASS belongs the character ? */
  74.         WHEN char = ESC THEN DO
  75.           call getchar()                                                /* next char */
  76.           SELECT                                  /* CSI: 'superset' von ESC[ */
  77.             WHEN char='[' THEN DO 
  78.               IF getchar()='P' THEN DO 
  79.                                                                         /* test for P<n>"r and skip the raw bytes */
  80.                 IF getzahl()='"' THEN IF getchar()='r' THEN DO; DO j=1 TO val ; call getchar() ; END; ITERATE; END
  81.                 IF index(' #"(',char)>0 THEN call getchar()             /* two char footer ? */            
  82.                 ITERATE
  83.               END
  84.               ELSE DO ;                                                 /* skip the number(s) and the 1 or 2 char footer of the sequence */
  85.                 IF index(' #"(',getzahl())>0 THEN call getchar()
  86.                 ITERATE
  87.               END
  88.             END
  89.             WHEN index(' #"(',char)>0 THEN DO 
  90.                                                                         /* remove 3 letter codes */  
  91.               call getchar()
  92.               ITERATE
  93.             END
  94.             OTHERWISE ITERATE                                           /* 2 letter codes */  
  95.           END
  96.         END
  97.         WHEN char = CSI THEN DO
  98.         /* CSI ist ein 'superset' von ESC[ */
  99.               IF getchar()='P' THEN DO 
  100.                                                                         /* test for P<n>"r and skip the raw bytes */
  101.         /* getzahl degeniert u.u. zu NIL (nicht einmal getchar !) :-) */
  102.                 IF getzahl()='"' THEN IF getchar()='r' THEN DO; DO j=1 TO val ; call getchar() ; END; ITERATE; END
  103.                 IF index(' #"(',char)>0 THEN call getchar()             /* two char footer ? */            
  104.                 ITERATE
  105.               END
  106.               ELSE DO ;                                                 /* skip the number(s) and the 1 or 2 char footer of the sequence */
  107.                 IF index(' #"(',getzahl())>0 THEN call getchar()
  108.                 ITERATE
  109.               END
  110.                                                                         /* (it's footer), before which there may be a sequence */
  111.         END
  112.         WHEN char=DEL THEN DO ; call getchar(); ITERATE ;END            /* (3) delete removes the next char */
  113.         WHEN char=FF THEN DO
  114.           IF noff THEN char=LF
  115.           out=out||char
  116.         END
  117.         WHEN char=BS THEN DO
  118.           IF nobs THEN DO
  119.              IF getchar()='_' THEN ITERATE                              /* backspaces: xBS_ -> x ; _BSx|xBSx|yBSx -> x */ 
  120.              IF out~='' THEN out=substr(out,1,length(out)-1)
  121.           END   
  122.           out=out||char
  123.         END
  124.         OTHERWISE nop                            /* remove the character ! */
  125.       END /* END SELECT */
  126. /* avoid common code here ! since i'm iterating in advance ! */
  127.    END /* ELSE */
  128. END
  129.  
  130. done:
  131. call close(infh)
  132. call close(outfh)
  133. EXIT 0   
  134.  
  135. /****************************************************************/  /* subroutines */
  136.  
  137. /* You might wish to call these routines Rexx Level II File IO :-) */
  138.  
  139. readblock: PROCEDURE EXPOSE infh line i inputsize out outfh oldchar /* read the next chunk */
  140.   oldchar=right(line,1)
  141.   line = readch(infh,inputsize)
  142.   inputsize=length(line)                                            /* adjust the length, if zero: eof */
  143.   i=1
  144.   IF line=='' THEN i=0
  145.   k=length(out)-1
  146.   if k<0 then k=0
  147.   call writech(outfh,substr(out,1,k))
  148.   out=right(out,1)                            /* out and oldchar: a kind of unputc and ungetc :-) */
  149. RETURN i
  150.  
  151. getchar:   PROCEDURE EXPOSE infh line i char inputsize out outfh oldchar
  152.                                     /* ATN return the current char (line[i]) or blank and advance */
  153.   IF i=0 THEN a=''
  154.   ELSE DO
  155.     IF i>inputsize THEN call readblock                              /* next buffer */
  156.     IF inputsize=0 THEN a=''
  157.     ELSE a= substr(line,i,1)
  158.   END
  159.   i=i+1
  160.   oldchar=char
  161.   char = a
  162. RETURN a
  163.  
  164. getzahl:  PROCEDURE EXPOSE infh line i char val inputsize out outfh oldchar
  165.   val=''
  166.   DO FOREVER ;                                                      /* read a number */
  167.     IF index('0123456789P',char)=0 THEN LEAVE
  168.     IF char~='P' THEN val=val||char
  169.     call getchar()
  170.   END
  171.   IF char=';' THEN DO ; call getchar() ; call getzahl() ; END       /* further numbers, introduced by ';' */
  172.   IF datatype(val)~='NUM' then val=0
  173.   oldchar=''                                /* disable test for removal of BS - undefined */
  174. RETURN char
  175.