|
Somebody asked for a sample of a Code macro. I was tinkering with a parser
for RPG (to enforce standards) and worked up a skeleton. It's bare-bones
but shows some of the things one can do in ReXX. Comments and critiques
welcome!
/* Parse out RPG names */
/* Lessons learnt:
1) Use the macro log! (ALT-W, a) */
/* Make sure we're reading rpg! */
'extract doctype into sourceDocType'
if (sourceDocType <> 'IRP') then
do
say '"'sourceDocType'" files can''t be processed.'
exit
end
/* Find the install directory */
'extract global.CODEINSTALLDIR into codeDir'
/* Who am I? */
'extract docnum into sourceDoc'
'extract name into sourceName'
/* create the log window, and go there */
lx codeDir'\Tmp\names.txt'
'extract docnum into targetDoc'
'insert Name log from' sourceName
/* Go back to the source window */
lxi 'godoc docnum' sourceDoc
/* move to top of source and begin processing */
top
'extract elements into sourceLineCount'
/* Read lines */
do i = 1 to sourceLineCount
'extract content into sourceLine'
/* log the line into the target */
lxi 'godoc docnum' targetDoc
insert sourceLine
/* Parse it */
select
when sourceDocType='IRP' then
rc = parseRPG(sourceLine)
otherwise
NOP
end
/* move down one line */
lxi 'godoc docnum' sourceDoc
primitive newline
end
exit
parseRPG: procedure
parse upper arg line
/* What sort of line is it? */
spec = substr(line,6,1)
commentFlag = substr(line,7,1)
compileTimeArrayFlag = substr(line,1,2)
if (compileTimeArrayFlag = '**') then
do
insert 'CT data found - ending'
exit
end
select
when (commentFlag = '*') then do
NOP
end
when (spec=' ') then do
NOP
end
when (spec='H') then do
NOP
end
when (spec='F') then do
rc=parseRPGFspec(line)
end
when (spec='D') then do
NOP
end
when (spec='I') then do
NOP
end
when (spec='C') then do
NOP
end
when (spec='O') then do
NOP
end
otherwise
insert 'unknown'
end
return 0
parseRPGFspec: procedure
parse arg line
/* fixed columns */
fileName=substr(line,7,10)
if (fileName<>'') then
insert 'file name='fileName
/* keywords */
parse var line pre '(' kwd ')' post
/* kwd with colon like sfile(recfmt:sflrrn) */
if (POS(':',kwd)>0) then do
parse var kwd kwd1 ':' kwd2
insert 'kwd1='STRIP(kwd1)
insert 'kwd2='STRIP(kwd2)
end
else
insert 'kwd='STRIP(kwd)
return 0
--buck
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2025 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.