home *** CD-ROM | disk | FTP | other *** search
/ Amiga MA Magazine 1998 #6 / amigamamagazinepolishissue1998.iso / coders / jËzyki_programowania / amigae / e_v3.2a / pdsrc / ag2txt / ag2txt13.e < prev   
Text File  |  1996-09-19  |  3KB  |  121 lines

  1. ENUM NONE, ATSIGN, TILLEND, BRAC, BRACSEND, TILLBRAC,
  2.      GOT_N, GOT_O, GOT_D, GOT_E, SKIPARG, NODE, NODESEND
  3.  
  4. ENUM ERR_SHORT, ERR_MEM, ERR_IO, ERR_FILE
  5.  
  6. CONST QUOTE=34, RET=10, ESC=27,
  7.       FONT_BOLD="1", FONT_ITALIC="3", FONT_REVERSE="7", FONT_NORMAL="0"
  8.  
  9. RAISE ERR_MEM IF New()=NIL,
  10.       ERR_FILE IF Open()=NIL
  11.  
  12. PROC main() HANDLE
  13.   DEF state=NONE, in:PTR TO CHAR, out:PTR TO CHAR, file=NIL, len,
  14.       max, bin=NIL, bout=NIL, errors:PTR TO LONG, quote
  15.   file:=Open(arg, OLDFILE)
  16.   IF (len:=FileLength(arg))=0 THEN Raise(ERR_SHORT)
  17.   bin:=New(len)
  18.   bout:=New(len)
  19.   IF (Read(file, bin, len)<>len) THEN Raise(ERR_IO)
  20.   in:=bin
  21.   out:=bout
  22.   max:=bin+len
  23.   WHILE in<max
  24.     SELECT state
  25.     CASE NONE
  26.       IF in[]="@"
  27.         IF in[1]="{"
  28.           state:=BRAC
  29.           in++
  30.         ELSEIF (in=bin) OR (in[-1]=RET)
  31.           state:=ATSIGN
  32.         ELSE
  33.           out[]++:=in[]
  34.         ENDIF
  35.       ELSE
  36.         out[]++:=in[]
  37.       ENDIF
  38.     CASE ATSIGN
  39.       IF (in[]="N") OR (in[]="n")
  40.         state:=GOT_N
  41.       ELSE
  42.         state:=TILLEND
  43.       ENDIF
  44.     CASE TILLEND
  45.       IF in[]=RET THEN state:=NONE
  46.     CASE BRAC
  47.       IF in[]<>" "
  48.         quote:=(in[]=QUOTE)
  49.     out[]++:=ESC
  50.         out[]++:="["
  51.         out[]++:=FONT_ITALIC
  52.         out[]++:="m"
  53.         state:=BRACSEND
  54.       ENDIF
  55.     CASE BRACSEND
  56.       IF (quote AND (in[]=QUOTE)) OR ((quote=FALSE) AND (in[]=" "))
  57.     out[]++:=ESC
  58.         out[]++:="["
  59.         out[]++:=FONT_NORMAL
  60.         out[]++:="m"
  61.         state:=TILLBRAC
  62.       ELSE
  63.         out[]++:=in[]
  64.       ENDIF
  65.     CASE TILLBRAC
  66.       IF in[]="}" THEN state:=NONE
  67.     CASE GOT_N
  68.       IF (in[]="O") OR (in[]="o") THEN state:=GOT_O ELSE state:=TILLEND
  69.     CASE GOT_O
  70.       IF (in[]="D") OR (in[]="d") THEN state:=GOT_D ELSE state:=TILLEND
  71.     CASE GOT_D
  72.       IF (in[]="E") OR (in[]="e") THEN state:=GOT_E ELSE state:=TILLEND
  73.     CASE GOT_E
  74.       IF in[]<>" "
  75.         quote:=(in[]=QUOTE)
  76.         state:=SKIPARG
  77.       ENDIF
  78.     CASE SKIPARG
  79.       IF (quote AND (in[]=QUOTE)) OR ((quote=FALSE) AND (in[]=" "))
  80.         state:=NODE
  81.       ENDIF
  82.     CASE NODE
  83.       IF in[]<>" "
  84.         quote:=(in[]=QUOTE)
  85.     out[]++:=ESC
  86.         out[]++:="["
  87.         out[]++:=FONT_REVERSE
  88.         out[]++:="m"
  89.         state:=NODESEND
  90.       ENDIF
  91.     CASE NODESEND
  92.       IF (quote AND (in[]=QUOTE)) OR
  93.          ((quote=FALSE) AND (in[]=" ")) OR (in[]=RET)
  94.     out[]++:=ESC
  95.         out[]++:="["
  96.         out[]++:=FONT_NORMAL
  97.         out[]++:="m"
  98.         out[]++:=RET
  99.         out[]++:=RET
  100.         state:=IF in[]=RET THEN NONE ELSE TILLEND
  101.       ELSE
  102.         out[]++:=in[]
  103.       ENDIF
  104.     DEFAULT
  105.       out[]++:=in[]
  106.     ENDSELECT
  107.     in++
  108.   ENDWHILE
  109.   WriteF('')
  110.   Write(stdout, bout, out-bout)
  111.   Close(file)
  112. EXCEPT
  113.   errors:=['File is empty\n', 'Could not allocate memory\n',
  114.            'File reading error\n'] 
  115.   IF file THEN Close(file)
  116.   IF exception=ERR_FILE
  117.     WriteF('File "\s" not found!\n', arg)
  118.   ELSE
  119.     WriteF(errors[exception])
  120.   ENDIF
  121. ENDPROC