home *** CD-ROM | disk | FTP | other *** search
- {From XRACTON@FULLERTON.EDU Thu Jun 24 00:38:10 1993
- Return-Path: <XRACTON@FULLERTON.EDU>
- Received: from CCVAX.FULLERTON.EDU (csu.Fullerton.EDU) by leven.appcomp.utas.edu.au (4.1/SMI-4.1)
- id AA05310; Thu, 24 Jun 93 00:37:44 EST
- Received: from FULLERTON.EDU by FULLERTON.EDU (PMDF #2446 ) id
- <01GZPKD4PQ3Q002QFT@FULLERTON.EDU>; Wed, 23 Jun 1993 07:36:05 PST
- Date: 23 Jun 1993 07:36:05 -0800 (PST)
- From: ROLAND ACTON <XRACTON@FULLERTON.EDU>
- Subject: A-A program code
- To: dbenn@leven.appcomp.utas.edu.au
- Message-Id: <01GZPKD4PZQW002QFT@FULLERTON.EDU>
- X-Vms-To: IN%"dbenn@leven.appcomp.utas.edu.au"
- Mime-Version: 1.0
- Content-Transfer-Encoding: 7BIT
- Status: OR}
-
- Rem *** AMOS to ACE (program)
- Rem ***
- Rem *** FUNCTION:
- Rem *** Converts (some) AMOS BASIC commands to ACE BASIC.
- Rem ***
- Rem *** REVISION HISTORY:
- Rem *** Version 1.0: Roland Acton (xracton@ccvax.fullerton.edu)
- Rem ***
- Rem *** BUGS:
- Rem *** String constants may accidentally be converted if they match
- Rem *** with A-A's templates.
- Rem *** The "then" version of AMOS's IF statement will be improperly
- Rem *** converted and generate an error message from ACE.
-
- DEFINT a-z
- STRING buffer$ size 256, a$ size 2, holder$ size 2, output$ size 256
- STRING checker$ size 2, infile$ size 256
-
- Library dos
- Declare Function xRead& Library dos
- Declare Function xWrite& Library dos
-
- IF ARGCOUNT<>2 THEN
- Print "AMOS to ACE"
- Print "V1.0 by Roland Acton (xracton@ccvax.fullerton.edu) - June 1993"
- Print "Syntax: AMOStoACE <source-file> <destination-file>"
- STOP
- END IF
- Const CONVBEGINNUM=21
- Const CONVANYNUM=10
- Dim CONVBEGINFROM$(CONVBEGINNUM),CONVBEGINTO$(CONVBEGINNUM)
- Dim CONVANYFROM$(CONVANYNUM),CONVANYTO$(CONVANYNUM)
- Dim VARIABLE$(9)
- Gosub TEMPLATES
- OPEN "I", #1, ARG$(1)
- OPEN "O", #2, ARG$(2)
- BUFFER$=""
- AMOSCODE=0
- Print #2,"DEFLNG a-z"+Chr$(10);
- REMAINING=xRead(Handle(1),Varptr(INFILE$),256&)
- INFILEOFFSET=0
- BEGINNINGOFLINE=0
- MAINLOOP:
- INSIDETEXT=0
- BUFFEROFFSET=0
- A=Asc(Right$(BUFFER$,1))
- While(((Eof(1)<>-1) or(REMAINING>0)) and(A<>10))
- BEGINNINGOFLINE=1
- A=Peek(Varptr(INFILE$)+INFILEOFFSET)
- ++INFILEOFFSET
- --REMAINING
- IF ((A=58) and(INSIDETEXT=0)) THEN
- If Right$(BUFFER$,1)<>" " THEN
- Poke Varptr(BUFFER$)+BUFFEROFFSET,58
- ++BUFFEROFFSET
- End If
- Poke Varptr(BUFFER$)+BUFFEROFFSET,10
- A=10
- Else
- IF A=34 THEN
- INSIDETEXT=1-INSIDETEXT
- END IF
- Poke Varptr(BUFFER$)+BUFFEROFFSET,A
- END IF
- ++BUFFEROFFSET
- Poke Varptr(BUFFER$)+BUFFEROFFSET,0
- IF REMAINING=0 THEN
- REMAINING=xRead(Handle(1),Varptr(INFILE$),256&)
- INFILEOFFSET=0
- END IF
- Wend
- IF ((BUFFER$="") and(Eof(1)=-1)) THEN
- Gosub FINALIZATION
- STOP
- END IF
- Rem *** "Copy and change" isn't usually a good idea, but in this
- Rem *** case it produces the fastest object code.
- IF BEGINNINGOFLINE=1 THEN
- BEGINNINGOFLINE=0
- SPACEKLUDGE:
- If Left$(BUFFER$,1)=" " THEN
- xWrite(Handle(2),Varptr(BUFFER$),1)
- BUFFER$=Mid$(BUFFER$,2)
- Goto SPACEKLUDGE
- End If
- Gosub BEFORECHECK
- For C=1 To CONVBEGINNUM
- For Z=1 To 9
- VARIABLE$(Z)=""
- Next
- SUCCESS=1
- BUFFERSTEP=1
- For Z=1 To Len(CONVBEGINFROM$(C))
- IF Mid$(CONVBEGINFROM$(C),Z,1)="\" THEN
- VARUSED=Val(Mid$(CONVBEGINFROM$(C),Z+1,1))
- HOLDER$=Mid$(CONVBEGINFROM$(C),Z+2,1)
- PARNUM=0
- IF HOLDER$=")" THEN
- A=Instr(BUFFERSTEP,BUFFER$,")")
- B=INSTR(BUFFERSTEP,BUFFER$,"(")
- While((B>0) and(B<A))
- B=INSTR(B+1,BUFFER$,"(")
- PARNUM=PARNUM+1
- Wend
- Else
- A=INSTR(BUFFERSTEP,BUFFER$,HOLDER$)
- END IF
- While PARNUM>0
- A=Instr(A+1,BUFFER$,")")
- PARNUM=PARNUM-1
- Wend
- B=Instr(BUFFERSTEP,BUFFER$,Mid$(CONVBEGINFROM$(C),Z+3,1))
- IF ((A>0) and((B=0) or(A<=B))) THEN
- VARIABLE$(VARUSED)=VARIABLE$(VARUSED)+Mid$(BUFFER$,BUFFERSTEP,A-BUFFERSTEP)
- BUFFERSTEP=A
- Else
- SUCCESS=0
- Z=Len(CONVBEGINFROM$(C))
- END IF
- Z=Z+3
- Else
- IF Mid$(CONVBEGINFROM$(C),Z,1)<>Mid$(BUFFER$,BUFFERSTEP,1) THEN
- SUCCESS=0
- Z=Len(CONVBEGINFROM$(C))
- END IF
- END IF
- ++BUFFERSTEP
- Next
- IF SUCCESS=1 THEN
- OUTPUT$=""
- For Z=1 To Len(CONVBEGINTO$(C))
- CHECKER$=Mid$(CONVBEGINTO$(C),Z,1)
- IF CHECKER$="\" THEN
- OUTPUT$=OUTPUT$+VARIABLE$(Val(Mid$(CONVBEGINTO$(C),Z+1,1)))
- Z=Z+1
- Else
- OUTPUT$=OUTPUT$+CHECKER$
- END IF
- Next
- xWrite(Handle(2),Varptr(OUTPUT$),Len(OUTPUT$))
- BUFFER$=Mid$(BUFFER$,BUFFERSTEP)
- C=CONVBEGINNUM
- BEGINNINGOFLINE=1
- END IF
- Next
- Gosub AFTERCHECK
- Goto MAINLOOP
- END IF
- Gosub BEFORECHECK
- For C=1 To CONVANYNUM
- For Z=1 To 9
- VARIABLE$(Z)=""
- Next
- SUCCESS=1
- BUFFERSTEP=1
- For Z=1 To Len(CONVANYFROM$(C))
- IF Mid$(CONVANYFROM$(C),Z,1)="\" THEN
- VARUSED=Val(Mid$(CONVANYFROM$(C),Z+1,1))
- HOLDER$=Mid$(CONVANYFROM$(C),Z+2,1)
- PARNUM=0
- IF HOLDER$=")" THEN
- A=Instr(BUFFERSTEP,BUFFER$,")")
- B=INSTR(BUFFERSTEP,BUFFER$,"(")
- While((B>0) and(B<A))
- B=INSTR(B+1,BUFFER$,"(")
- PARNUM=PARNUM+1
- Wend
- Else
- A=INSTR(BUFFERSTEP,BUFFER$,HOLDER$)
- END IF
- While PARNUM>0
- A=Instr(A+1,BUFFER$,")")
- PARNUM=PARNUM-1
- Wend
- B=Instr(BUFFERSTEP,BUFFER$,Mid$(CONVANYFROM$(C),Z+3,1))
- IF ((A>0) and((B=0) or(A<=B))) THEN
- VARIABLE$(VARUSED)=VARIABLE$(VARUSED)+Mid$(BUFFER$,BUFFERSTEP,A-BUFFERSTEP)
- BUFFERSTEP=A
- Else
- SUCCESS=0
- Z=Len(CONVANYFROM$(C))
- END IF
- Z=Z+3
- Else
- IF Mid$(CONVANYFROM$(C),Z,1)<>Mid$(BUFFER$,BUFFERSTEP,1) THEN
- SUCCESS=0
- Z=Len(CONVANYFROM$(C))
- END IF
- END IF
- ++BUFFERSTEP
- Next
- IF SUCCESS=1 THEN
- OUTPUT$=""
- For Z=1 To Len(CONVANYTO$(C))
- CHECKER$=Mid$(CONVANYTO$(C),Z,1)
- IF CHECKER$="\" THEN
- OUTPUT$=OUTPUT$+VARIABLE$(Val(Mid$(CONVANYTO$(C),Z+1,1)))
- Z=Z+1
- Else
- OUTPUT$=OUTPUT$+CHECKER$
- END IF
- Next
- xWrite(Handle(2),Varptr(OUTPUT$),Len(OUTPUT$))
- BUFFER$=Mid$(BUFFER$,BUFFERSTEP)
- C=CONVANYNUM
- END IF
- Next
- Gosub AFTERCHECK
- IF (Right$(BUFFER$,1)=Chr$(10)) THEN
- xWrite(Handle(2),Varptr(BUFFER$),1)
- BUFFER$=Mid$(BUFFER$,2)
- END IF
- Goto MAINLOOP
- FINALIZATION:
- Close 1
- Close 2
- Library Close dos
- Return
- BEFORECHECK:
- IF Left$(BUFFER$,14)="Rem Begin AMOS" THEN
- AMOSCODE=1
- END IF
- IF Left$(BUFFER$,12)="Rem End AMOS" THEN
- AMOSCODE=0
- BUFFER$="Rem AMOS"+Chr$(10)
- END IF
- IF AMOSCODE=1 THEN
- BUFFER$=Chr$(10)
- END IF
- IF Left$(BUFFER$,7)="Rem ACE" THEN
- xWrite(Handle(2),Varptr(BUFFER$)+7,Len(BUFFER$)-7)
- BUFFER$=Chr$(10)
- END IF
- Return
- AFTERCHECK:
- Return
- TEMPLATES:
- Rem *** FROM templates contain either case-sensitive "constants" or
- Rem *** the "variable" character "\". The format of the embedded
- Rem *** variable flag is:
- Rem *** \<variable number><success-char><fail-char>
- Rem *** If the <success-char> and <fail-char> are the same, the
- Rem *** match will always be successful.
- Rem *** TO templates contain either constants or the variable
- Rem *** character followed immediately by the variable number.
- CONVBEGINFROM$(1)="Inc \1"+Chr$(10)+Chr$(10)
- CONVBEGINTO$(1)="++\1"+Chr$(10)
- CONVBEGINFROM$(2)="Dec \1"+Chr$(10)+Chr$(10)
- CONVBEGINTO$(2)="--\1"+Chr$(10)
- CONVBEGINFROM$(3)="Add \1,"+Chr$(10)+"\2"+Chr$(10)+Chr$(10)
- CONVBEGINTO$(3)="\1=\1+\2"+Chr$(10)
- CONVBEGINFROM$(4)="End If "
- CONVBEGINTO$(4)="END IF"
- CONVBEGINFROM$(5)="If\1"+Chr$(10)+Chr$(10)
- CONVBEGINTO$(5)="IF\1 THEN"+Chr$(10)
- CONVBEGINFROM$(6)="Do "+Chr$(10)
- CONVBEGINTO$(6)="REPEAT"+Chr$(10)
- CONVBEGINFROM$(7)="Loop "+Chr$(10)
- CONVBEGINTO$(7)="UNTIL 1=0"+Chr$(10)
- CONVBEGINFROM$(8)="Fix(\1)"+Chr$(10)
- CONVBEGINTO$(8)="FIX \1+1"
- CONVBEGINFROM$(9)="Say \1,"+Chr$(10)+"\2"+Chr$(10)+Chr$(10)
- CONVBEGINTO$(9)="SAY \1"+Chr$(10)
- CONVBEGINFROM$(10)="Open Out \1,"+Chr$(10)+"\2"+Chr$(10)+Chr$(10)
- CONVBEGINTO$(10)="OPEN "+Chr$(34)+"O"+Chr$(34)+", #\1, \2"+Chr$(10)
- CONVBEGINFROM$(11)="Open In \1,"+Chr$(10)+"\2"+Chr$(10)+Chr$(10)
- CONVBEGINTO$(11)="OPEN "+Chr$(34)+"I"+Chr$(34)+", #\1, \2"+Chr$(10)
- CONVBEGINFROM$(12)="Append \1,"+Chr$(10)+"\2"+Chr$(10)+Chr$(10)
- CONVBEGINTO$(12)="OPEN "+Chr$(34)+"A"+Chr$(34)+", #\1, \2"+Chr$(10)
- CONVBEGINFROM$(13)="Doke \1,"+Chr$(10)+"\2"+Chr$(10)+Chr$(10)
- CONVBEGINTO$(13)="POKEW \1,\2"+Chr$(10)
- CONVBEGINFROM$(14)="Loke \1,"+Chr$(10)+"\2"+Chr$(10)+Chr$(10)
- CONVBEGINTO$(14)="POKEL \1,\2"+Chr$(10)
- CONVBEGINFROM$(15)="Procedure \1["+Chr$(10)+"\2]"+Chr$(10)
- CONVBEGINTO$(15)="SUB \1(\2)"
- CONVBEGINFROM$(16)="Procedure \1"+Chr$(10)+Chr$(10)
- CONVBEGINTO$(16)="SUB \1"+Chr$(10)
- CONVBEGINFROM$(17)="End Proc"
- CONVBEGINTO$(17)="END SUB"
- CONVBEGINFROM$(18)="Proc \1["+Chr$(10)+"\2]"+Chr$(10)
- CONVBEGINTO$(18)="CALL \1(\2)"
- CONVBEGINFROM$(19)="Proc \1"+Chr$(10)+Chr$(10)
- CONVBEGINTO$(19)="CALL \1"+Chr$(10)
- CONVBEGINFROM$(20)="Set Buffer \1"+Chr$(10)+Chr$(10)
- CONVBEGINTO$(20)=Chr$(10)
- CONVBEGINFROM$(21)="Rename \1T"+chr$(10)+"o \2"+chr$(10)+chr$(10)
- CONVBEGINTO$(21)="NAME \1AS \2"+chr$(10)
- CONVANYFROM$(1)="Instr(\1,"+Chr$(10)+"\2,)\3)"+Chr$(10)
- CONVANYTO$(1)="INSTR(\3,\1,\2)"
- CONVANYFROM$(2)="Deek(\1)"+Chr$(10)
- CONVANYTO$(2)="PEEKW(\1)"
- CONVANYFROM$(3)="Leek(\1)"+Chr$(10)
- CONVANYTO$(3)="PEEKL(\1)"
- CONVANYFROM$(4)="Free"
- CONVANYTO$(4)="FRE(-1)"
- CONVANYFROM$(5)="Upper$(\1)"+Chr$(10)
- CONVANYTO$(5)="UCASE$(\1)"
- CONVANYFROM$(6)="Rnd(\1)"+Chr$(10)
- CONVANYTO$(6)="RND"
- CONVANYFROM$(7)="Hex$(\1,"+Chr$(10)+"\2)"+Chr$(10)
- CONVANYTO$(7)="HEX$(\1)"
- CONVANYFROM$(8)="Bin$(\1,"+Chr$(10)+"\2)"+Chr$(10)
- CONVANYTO$(8)="BIN$(\1)"
- CONVANYFROM$(9)="String$(\1,"+Chr$(10)+"\2)"+Chr$(10)
- CONVANYTO$(9)="STRING$(\2,\1)"
- CONVANYFROM$(10)="Lower$(\1)"+Chr$(10)
- CONVANYTO$(10)="LCASE$(\1)"
- Return
-