123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- /* getrecord.rexx
- This is a rexxscript to scan for pascal records.
- I made this one to check my translation of
- cheaders to fpc units. It will write two
- files one pascalfile and one cfile.
- The pascalfile you can almost everytime just
- compile with fpc. In the cfile you have to
- make some changes, just put in a line that
- include the cheader for you testprogram.
- So if you translate a cheader to fpc just
- let this script check it out, if you get
- the same result from both program you have
- probably made the translation correct.
- Usage:
- rx getrecord yourunit.pas
- [email protected]
- */
- SIGNAL ON BREAK_C
- SIGNAL ON SYNTAX
- parse arg name
- if name = '' then do
- say 'Input filename to scan for records'
- parse pull name end
- if name = '' then do
- say 'Error no filename'
- exit 20
- end
- end
- k = 1
- thesource = name
- if index(name,'.') > 0 then do
- parse var name thesource '.' extension
- end
- pasname = thesource || 'rec1.pas'
- cname = thesource || 'rec2.c'
- IF ~Open('textfile',name,'READ') THEN DO
- say 'File not found'
- exit 20
- end
- else do
- say 'Scanning ' || name
- i = 1
- DO WHILE ~eof('textfile')
- line.i = ReadLn('textfile')
- line.i = Strip(line.i)
- myproc = Word(line.i,3)
- myproc = Upper(myproc)
- IF myproc = "RECORD" THEN DO
- CALL CheckLine(line.i)
- SAY "Doing line :" || i
- END
- i = i +1
- END
- CALL Close('textfile')
- if k > 1 then do
- call writepasfile
- call writecfile
- say 'Done'
- end
- else say 'No records found'
- END
- EXIT
- pasheader:
- writeln('outfile','Program testrecords;')
- writeln('outfile','')
- writeln('outfile','uses exec,' || thesource || ';')
- writeln('outfile','')
- writeln('outfile','begin')
- return
- writepasfile:
- if ~Open('outfile',pasname,'W') then do
- say 'Can not create file'
- exit 20
- end
- else do
- SAY "Working on " || pasname
- call pasheader
- do j = 1 to k-1
- thename = record.j
- towrite = 'writeln(' || "'" || thename || "',' ':30-length(" || "'" ||thename || "'),"
- towrite = towrite || "':'"
- towrite = towrite || ',sizeof(' || thename || '));'
- writeln('outfile',towrite)
- end j
- writeln('outfile','end.')
- writeln('outfile','')
- CALL Close('outfile')
- RETURN
- cheader:
- writeln('outfile','');
- writeln('outfile','#include ' || '"stdio.h"')
- writeln('outfile','')
- writeln('outfile','main()')
- writeln('outfile','{')
- return
- writecfile:
- if ~Open('outfile',cname,'W') then do
- say 'Can not create file'
- exit 20
- end
- else do
- SAY "Working on " || cname
- call cheader
- do j = 1 to k-1
- thename = record.j
- towrite = 'printf(' || '"%-30s:%d\n","' || thename || '",'
- towrite = towrite || 'sizeof(struct ' || right(thename,length(thename)-1) ||'));'
- writeln('outfile',towrite)
- end j
- writeln('outfile','}')
- writeln('outfile','')
- CALL Close('outfile')
- return
- CheckLine:
- PARSE ARG theline
- parse var theline thename thesep therecord therest
- if thesep = '=' then do
- thename = strip(thename)
- record.k = thename
- k = k +1
- end
- RETURN
- BREAK_C:
- SYNTAX:
- SAY "Sorry, error line" SIGL ":" ErrorText(RC) ":-("
- EXIT
|