home *** CD-ROM | disk | FTP | other *** search
/ Gold Fish 2 / goldfish_vol2_cd1.bin / files / dev / e / amiga_e / src / pd / ag2txt / ag2txt20.e < prev   
Text File  |  1993-10-06  |  4KB  |  160 lines

  1. OPT OSVERSION=37
  2.  
  3. ENUM NONE, ATSIGN, TILLEND, BRAC, BRACSEND, TILLBRAC,
  4.      GOT_N, GOT_O, GOT_D, GOT_E, SKIPARG, NODE, NODESEND
  5.  
  6. ENUM ERR_SHORT, ERR_MEM, ERR_IO, ERR_FILE, ERR_ARGS, ERR_NONE
  7.  
  8. ENUM ARG_FROM, ARG_TO, ARG_NODEFONT, ARG_LINKFONT
  9.  
  10. ENUM NODEFONT, LINKFONT
  11.  
  12. CONST QUOTE=34, RET=10, ESC=27,
  13.       FONT_BOLD="1", FONT_ITALIC="3", FONT_REVERSE="7", FONT_NORMAL="0"
  14.  
  15. RAISE ERR_ARGS IF ReadArgs()=NIL,
  16.       ERR_MEM  IF New()=NIL,
  17.       ERR_FILE IF Open()=NIL
  18.  
  19. DEF font[2]:ARRAY
  20.  
  21. PROC main() HANDLE
  22.   DEF state=NONE, quote, in:PTR TO CHAR, out:PTR TO CHAR,
  23.       from=NIL, to=NIL, len, max, bin=NIL, bout=NIL,
  24.       errors:PTR TO LONG, rdargs=NIL, args:PTR TO LONG, templ
  25.   args:=[0, 0, 0, 0]
  26.   templ:='FROM/A,TO,NODEFONT=NODE/K,LINKFONT=LINK/K'
  27.   rdargs:=ReadArgs(templ, args, NIL)
  28.   from:=Open(args[ARG_FROM], OLDFILE)
  29.   IF (len:=FileLength(args[ARG_FROM]))=0 THEN Raise(ERR_SHORT)
  30.   IF args[ARG_TO]
  31.     to:=Open(args[ARG_TO], NEWFILE)
  32.   ELSE
  33.     WriteF('')
  34.     to:=stdout
  35.   ENDIF
  36.   font[NODEFONT]:=FONT_REVERSE
  37.   font[LINKFONT]:=FONT_ITALIC
  38.   IF args[ARG_NODEFONT] THEN setfont(args[ARG_NODEFONT], NODEFONT)
  39.   IF args[ARG_LINKFONT] THEN setfont(args[ARG_LINKFONT], LINKFONT)
  40.   bin:=New(len)
  41.   bout:=New(len)
  42.   IF (Read(from, bin, len)<>len) THEN Raise(ERR_IO)
  43.   in:=bin
  44.   out:=bout
  45.   max:=bin+len
  46.   WHILE in<max
  47.     SELECT state
  48.     CASE NONE
  49.       IF in[]="@"
  50.         IF in[1]="{"
  51.           state:=BRAC
  52.           in++
  53.         ELSEIF (in=bin) OR (in[-1]=RET)
  54.           state:=ATSIGN
  55.         ELSE
  56.           out[]++:=in[]
  57.         ENDIF
  58.       ELSE
  59.         out[]++:=in[]
  60.       ENDIF
  61.     CASE ATSIGN
  62.       IF (in[]="N") OR (in[]="n")
  63.         state:=GOT_N
  64.       ELSE
  65.         state:=TILLEND
  66.       ENDIF
  67.     CASE TILLEND
  68.       IF in[]=RET THEN state:=NONE
  69.     CASE BRAC
  70.       IF in[]<>" "
  71.         quote:=(in[]=QUOTE)
  72.     out[]++:=ESC
  73.         out[]++:="["
  74.         out[]++:=font[LINKFONT]
  75.         out[]++:="m"
  76.         state:=BRACSEND
  77.       ENDIF
  78.     CASE BRACSEND
  79.       IF (quote AND (in[]=QUOTE)) OR ((quote=FALSE) AND (in[]=" "))
  80.     out[]++:=ESC
  81.         out[]++:="["
  82.         out[]++:=FONT_NORMAL
  83.         out[]++:="m"
  84.         state:=TILLBRAC
  85.       ELSE
  86.         out[]++:=in[]
  87.       ENDIF
  88.     CASE TILLBRAC
  89.       IF in[]="}" THEN state:=NONE
  90.     CASE GOT_N
  91.       IF (in[]="O") OR (in[]="o") THEN state:=GOT_O ELSE state:=TILLEND
  92.     CASE GOT_O
  93.       IF (in[]="D") OR (in[]="d") THEN state:=GOT_D ELSE state:=TILLEND
  94.     CASE GOT_D
  95.       IF (in[]="E") OR (in[]="e") THEN state:=GOT_E ELSE state:=TILLEND
  96.     CASE GOT_E
  97.       IF in[]<>" "
  98.         quote:=(in[]=QUOTE)
  99.         state:=SKIPARG
  100.       ENDIF
  101.     CASE SKIPARG
  102.       IF (quote AND (in[]=QUOTE)) OR ((quote=FALSE) AND (in[]=" "))
  103.         state:=NODE
  104.       ENDIF
  105.     CASE NODE
  106.       IF in[]<>" "
  107.         quote:=(in[]=QUOTE)
  108.     out[]++:=ESC
  109.         out[]++:="["
  110.         out[]++:=font[NODEFONT]
  111.         out[]++:="m"
  112.         state:=NODESEND
  113.       ENDIF
  114.     CASE NODESEND
  115.       IF (quote AND (in[]=QUOTE)) OR
  116.          ((quote=FALSE) AND (in[]=" ")) OR (in[]=RET)
  117.     out[]++:=ESC
  118.         out[]++:="["
  119.         out[]++:=FONT_NORMAL
  120.         out[]++:="m"
  121.         out[]++:=RET
  122.         out[]++:=RET
  123.         state:=IF in[]=RET THEN NONE ELSE TILLEND
  124.       ELSE
  125.         out[]++:=in[]
  126.       ENDIF
  127.     DEFAULT
  128.       out[]++:=in[]
  129.     ENDSELECT
  130.     in++
  131.   ENDWHILE
  132.   Write(to, bout, out-bout)
  133.   Raise(ERR_NONE)
  134. EXCEPT
  135.   errors:=['File is empty\n', 'Could not allocate memory\n',
  136.            'File reading error\n'] 
  137.   IF to THEN Close(to)
  138.   IF from THEN Close(from)
  139.   IF rdargs THEN FreeArgs(rdargs)
  140.   IF exception=ERR_FILE
  141.     WriteF('File "\s" not found!\n', args[ARG_FROM])
  142.   ELSEIF exception=ERR_ARGS
  143.     WriteF('ag2txt: Usage "\s"\n', templ)
  144.   ELSEIF exception<>ERR_NONE
  145.     WriteF(errors[exception])
  146.   ENDIF
  147. ENDPROC
  148.  
  149. PROC setfont(str:PTR TO CHAR, ind)
  150.   UpperStr(str)
  151.   IF StrCmp(str, 'PLAIN', ALL)
  152.     font[ind]:=FONT_NORMAL
  153.   ELSEIF StrCmp(str, 'ITALIC', ALL)
  154.     font[ind]:=FONT_ITALIC
  155.   ELSEIF StrCmp(str, 'REVERSE', ALL)
  156.     font[ind]:=FONT_REVERSE
  157.   ELSEIF StrCmp(str, 'BOLD', ALL)
  158.     font[ind]:=FONT_BOLD
  159.   ENDIF
  160. ENDPROC