* SINGLE RECORD SCREEN 1
IDEBS01 DFHMSD TYPE=&SYSPARM,
X
TIOAPFX=YES,
X
CTRL=(FRSET,FREEKB),
X
LANG=COBOL,
X
EXTATT=YES,
X
MODE=INOUT
IDEBS01 DFHMDI SIZE=(024,080)
MP1-PRG DFHMDF POS=(01,001),LENGTH=008,ATTRB=(PROT,NORM)
DFHMDF POS=(01,010),LENGTH=008,ATTRB=(PROT,NORM),
X
INITIAL='********'
MP1-CPY DFHMDF POS=(01,019),LENGTH=042,ATTRB=(PROT,NORM)
DFHMDF POS=(01,062),LENGTH=007,ATTRB=(PROT,NORM),
X
INITIAL='*******'
MP1-DAT DFHMDF POS=(01,070),LENGTH=010,ATTRB=(PROT,NORM)
MP1-NAM DFHMDF POS=(02,001),LENGTH=008,ATTRB=(PROT,NORM)
DFHMDF POS=(02,010),LENGTH=001,ATTRB=(PROT,NORM)
MP1-FIL DFHMDF POS=(02,019),LENGTH=025,ATTRB=(PROT,NORM)
DFHMDF POS=(02,045),LENGTH=001,ATTRB=(PROT,NORM)
MP1-FUN DFHMDF POS=(02,048),LENGTH=013,ATTRB=(PROT,NORM)
DFHMDF POS=(02,062),LENGTH=001,ATTRB=(PROT,NORM)
DFHMDF POS=(02,070),LENGTH=003,ATTRB=(PROT,NORM),
X
INITIAL='PGE'
MP1-PAG DFHMDF POS=(02,074),LENGTH=006,ATTRB=(PROT,NORM)
DFHMDF POS=(03,001),LENGTH=079,ATTRB=(PROT,NORM),
X
INITIAL='***********************************************X
********************************'
DFHMDF POS=(04,001),LENGTH=008,ATTRB=(PROT,NORM),
X
INITIAL='CMND\KEY'
MP1-SKY DFHMDF POS=(04,010),LENGTH=032,ATTRB=(UNPROT,BRT),
X
INITIAL=' '
DFHMDF POS=(04,043),LENGTH=001,ATTRB=ASKIP
MP1-KDE DFHMDF POS=(04,045),LENGTH=035,ATTRB=(PROT,NORM)
*------------------------
DFHMDF POS=(07,002),LENGTH=009,ATTRB=(PROT,NORM),
X
INITIAL='FLDA1 '
MP1-FLDA1 DFHMDF
X
POS=(07,012),LENGTH=003,ATTRB=(PROT,NORM)
*------------------------
DFHMDF POS=(08,002),LENGTH=009,ATTRB=(PROT,NORM),
X
INITIAL='ALT1KEY1 '
MP1-ALT1KEY1 DFHMDF
X
POS=(08,012),LENGTH=005,ATTRB=(PROT,BRT),
X
PICOUT='-9(4)'
DFHMDF POS=(08,018),LENGTH=001,ATTRB=ASKIP
*------------------------
DFHMDF POS=(09,002),LENGTH=009,ATTRB=(PROT,NORM),
X
INITIAL='ALT2KEY1 '
MP1-ALT2KEY1 DFHMDF
X
POS=(09,012),LENGTH=010,ATTRB=(PROT,BRT),
X
PICOUT='-9(9)'
DFHMDF POS=(09,023),LENGTH=001,ATTRB=ASKIP
*------------------------
DFHMDF POS=(10,002),LENGTH=009,ATTRB=(PROT,NORM),
X
INITIAL='ALT2KEY2 '
MP1-ALT2KEY2 DFHMDF
X
POS=(10,012),LENGTH=019,ATTRB=(PROT,BRT),
X
PICOUT='-9(18)'
DFHMDF POS=(10,032),LENGTH=001,ATTRB=ASKIP
*------------------------
DFHMDF POS=(11,002),LENGTH=009,ATTRB=(PROT,NORM),
X
INITIAL='POSTCODE '
MP1-POSTCODE DFHMDF
X
POS=(11,012),LENGTH=003,ATTRB=(PROT,BRT)
DFHMDF POS=(11,016),LENGTH=001,ATTRB=ASKIP
*------------------------
DFHMDF POS=(12,002),LENGTH=009,ATTRB=(PROT,NORM),
X
INITIAL='UIUC '
MP1-UIUC DFHMDF
X
POS=(12,012),LENGTH=044,ATTRB=(PROT,BRT)
DFHMDF POS=(12,057),LENGTH=001,ATTRB=ASKIP
*------------------------
DFHMDF POS=(13,002),LENGTH=009,ATTRB=(PROT,NORM),
X
INITIAL='USERKY '
MP1-USERKY DFHMDF
X
POS=(13,012),LENGTH=065,ATTRB=(PROT,BRT)
DFHMDF POS=(13,078),LENGTH=001,ATTRB=ASKIP
*------------------------
DFHMDF POS=(14,002),LENGTH=009,ATTRB=(PROT,NORM),
X
INITIAL='UKALL '
MP1-UKALL DFHMDF
X
POS=(14,012),LENGTH=065,ATTRB=(PROT,BRT)
DFHMDF POS=(14,078),LENGTH=001,ATTRB=ASKIP
*------------------------
DFHMDF POS=(15,002),LENGTH=009,ATTRB=(PROT,NORM),
X
INITIAL='IOKEYS '
MP1-IOKEYS DFHMDF
X
POS=(15,012),LENGTH=065,ATTRB=(PROT,BRT)
DFHMDF POS=(15,078),LENGTH=001,ATTRB=ASKIP
*------------------------
DFHMDF POS=(16,002),LENGTH=009,ATTRB=(PROT,NORM),
X
INITIAL='FLAGS '
MP1-FLAGS DFHMDF
X
POS=(16,012),LENGTH=030,ATTRB=(PROT,BRT)
DFHMDF POS=(16,043),LENGTH=001,ATTRB=ASKIP
*------------------------
DFHMDF POS=(17,002),LENGTH=009,ATTRB=(PROT,NORM),
X
INITIAL='Q1WS '
MP1-Q1WS DFHMDF
X
POS=(17,012),LENGTH=065,ATTRB=(PROT,BRT)
DFHMDF POS=(17,078),LENGTH=001,ATTRB=ASKIP
*------------------------
DFHMDF POS=(21,001),LENGTH=079,ATTRB=(PROT,NORM),
X
INITIAL='***********************************************X
********************************'
MP1-ES1 DFHMDF POS=(22,001),LENGTH=079,ATTRB=(PROT,NORM)
MP1-ES2 DFHMDF POS=(23,001),LENGTH=079,ATTRB=(PROT,NORM)
MP1-MES DFHMDF POS=(24,001),LENGTH=078,ATTRB=(PROT,BRT)
DFHMSD TYPE=FINAL
END
Thanks
Graham Hobbs
This will do it - not an ISFP screen, just a browsable file - lost my
job this week and cannot develop it further. :(
Name is irrelevant, I called it EBMSTOOL. In Edit "macname ?" will give
you a "help" screen.
There is something similar on a CBTTAPE file, that actually crates an
ISPF screen, but I found after I wrote this and it cannot handle some
maps. '\|' in line two are the code-page dependent NOT(\) and OR(|)
characters used.
Some feedback would be appreciated now that I'm sitting at home all
day...
/* REXX edit macro to convert between BMS macros and screen image */
/*** trace ?r ***************************************************** \| *
* (C) Copyright Robert AH Prins, 2009-2009 *
************************************************************************
* ------------------------------------------------------------------ *
* | Date | By | Remarks | *
* |------------+------+----------------------------------------------| *
* | | | | *
* |------------+------+----------------------------------------------| *
* | 2009-06-25 | RAHP | Set returncode to 1 | *
* |------------+------+----------------------------------------------| *
* | 2009-06-10 | RAHP | Allow selection as 'n'th screen in member | *
* |------------+------+----------------------------------------------| *
* | 2009-06-08 | RAHP | Correction of help screen | *
* |------------+------+----------------------------------------------| *
* | 2009-06-03 | RAHP | Correction of attribute processing | *
* |------------+------+----------------------------------------------| *
* | 2009-05-28 | RAHP | Allow bracketing with (user-defined) labels | *
* |------------+------+----------------------------------------------| *
* | 2009-05-07 | RAHP | Comment out help information about as-yet | *
* | | | unimplemented features | *
* |------------+------+----------------------------------------------| *
* | 2009-04-23 | RAHP | Cater for mapsets | *
* |------------+------+----------------------------------------------| *
* | 2009-04-16 | RAHP | Add COLOR & HILIGHT attributes | *
* |------------+------+----------------------------------------------| *
* | 2009-04-06 | RAHP | Initial version (BMS to "screen image") | *
* |------------+------+----------------------------------------------| *
************************************************************************
* EBMSTOOL is a REXX edit macro that can be used to convert BMS macros *
* to a CICS screen layout and the reverse, a CICS screen layout (with *
* a bit if meta-data), to BMS macros. *
* *
* To-do: *
* *
* - add "screen image" to BMS macro code *
* - add option to build and display an ISPF version of the screen *
************************************************************************
* Send questions and bug reports to: *
* *
* robert @ prino . org *
* *
* Robert AH Prins *
* Taboralaan 46 *
* 8400 Oostende *
* Belgium *
************************************************************************
* This program is free software: you can redistribute it and/or *
* modify it under the terms of the GNU General Public License as *
* published by the Free Software Foundation, either version 3 of *
* the License, or (at your option) any later version. *
* *
* This program is distributed in the hope that it will be useful, *
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
* GNU General Public License for more details. *
* *
* You should have received a copy of the GNU General Public License *
* along with this program. If not, see <http://www.gnu.org/licenses/> *
***********************************************************************/
parse source source
parse value source with . . moi .
"isredit macro (parm) NOPROCESS"
parm = strip(translate(space(parm)))
"ispexec control errors return"
dest = '.zcsr'
line. = ''
type. = 'NOTE'
h.0i = 1
alpha = 'abcdefghijklmnopqrstuvwxyz'
crlf = x2c(0d0a)
nulls = x2c(ffff)
cols = '----+----1----+----2----+----3----+----4----+----5' ||,
'----+----6----+----7----+----8----+----9----+----0' ||,
'----+----1----+----2----+----3----+----4----+----5'
color. = '01'
color.0blue = '01'
color.0red = '03'
color.0pink = '07'
color.0green = '04'
color.0turquoise = '05'
color.0yellow = '06'
color.0neutral = '02'
hilite. = '0'
hilite.0reverse = '1'
hilite.0underline = '2'
hilite.0blink = '4'
"isredit (MEM) = member"
"isredit (DSN) = dataset"
if mem = '' then
srce = ''''dsn''''
else
srce = ''''dsn'('mem')'
select
when abbrev('SCREEN', word(parm, 1), 1) then call bms_2_screen
when abbrev('BMS', word(parm, 1), 1) then call screen_2_bms
when abbrev('ISPF', word(parm, 1), 1) then call bms_2_ispf
otherwise call help
end
exit 1
/***********************************************************************
* BMS_2_SCREEN: *
* *
* Convert BMS macros to a screen image *
***********************************************************************/
bms_2_screen:
"isredit f ' DFH" || "MDI ' all"
"isredit (FC) = find_counts"
fc = +fc
select
when fc = 0 then
do
i = h.0i
line.i = center(' Processing terminated ', 72, '=')
type.i = 'MSG'
i = i + 1
line.i = ' The source being processed does not contain, a',
'''DFH' || 'MDI'' macro that is'
i = i + 1
line.i = ' used to define the size of a BMS map.'
i = i + 1
line.i = ' Read the ''Help Screen'' below for the usage of',
'the' moi 'macro.'
i = i + 1
line.i = left('=', 72, '=')
type.i = 'MSG'
h.0i = i + 2
call help
exit 1
end
when fc > 1 then
do
"isredit process range BMS"
if rc \= 0 then
do
select
when words(parm) = 2 &,
datatype(word(parm, 2)) = 'NUM' &,
word(parm, 2) <= fc then
do
l1 = '.F'
l2 = '.L'
"isredit f ' DFH" || "MDI ' first"
do i = 2 to word(parm, 2)
"isredit f ' DFH" || "MDI ' next"
end
"isredit label .zcsr =" l1
"isredit f ' DFH" || "MDI ' next"
if rc \= 0 then
"isredit label .zl =" l2
else
do
"isredit (ZC) = linenum .zcsr"
"isredit label" zc - 1 "=" l2
end
end
when words(parm) = 3 then
do
l1 = strip(word(parm, 2),, '.')
if length(l1) > 5 |,
verify(l1, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') \= 0 then
l1 = '.ZILCH'
else
l1 = '.'l1
l2 = strip(word(parm, 3),, '.')
if length(l2) > 5 |,
verify(l2, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ') \= 0 then
l2 = '.ZILCH'
else
l2 = '.'l2
end
otherwise
do
l1 = '.BMSF'
l2 = '.BMSL'
end
end
"isredit (ZF) = linenum" l1
"isredit (ZL) = linenum" l2
rc = (+zf = 0) | (+zl = 0)
end
else
do
"isredit (ZF) = linenum .zfrange"
"isredit (ZL) = linenum .zlrange"
end
if rc \= 0 then
do
i = h.0i
line.i = center(' Processing terminated ', 72, '=')
type.i = 'MSG'
i = i + 1
line.i = ' The source being processed contains more',
'than one ''DFH' || 'MDI'' macro,'
i = i + 1
line.i = ' but no specific map was selected for rendering.'
i = i + 2
line.i = ' Read the ''Help Screen'' below for the usage',
'of the' moi 'macro.'
i = i + 1
line.i = left('=', 72, '=')
type.i = 'MSG'
h.0i = i + 2
call help
exit 1
end
end
otherwise
do
"isredit (ZF) = linenum .zf"
"isredit (ZL) = linenum .zl"
end
end
"isredit l" min(zf, zl)
/*********************************************************************
* Get data and truncate to 72 colums *
*********************************************************************/
b = 0
do i = min(zf, zl) to max(zf, zl)
"isredit (L) = line" i
/*******************************************************************
* Not interested in comments *
*******************************************************************/
if left(l, 1) \= '*' then
do
b = b + 1
bms.b = left(l, 72)
end
end
bms.0 = b
/*********************************************************************
* Concatenate macros spanning more than one line *
*********************************************************************/
m = 0
map = ''
do b = 1 to bms.0
select
/*****************************************************************
* No pending partial lines and no continuation *
*****************************************************************/
when map = '' &,
right(bms.b, 1) = '' then
do
m = m + 1
map.m = bms.b
end
/*****************************************************************
* No pending partial lines, but line is continued *
*****************************************************************/
when map = '' &,
right(bms.b, 1) \= '' then
do
map = substr(bms.b, 1, 71)
end
/*****************************************************************
* Pending partial lines and no continuation *
*****************************************************************/
when map \= '' &,
right(bms.b, 1) = '' then
do
m = m + 1
map.m = map || strip(substr(bms.b, 16))
map = ''
end
/*****************************************************************
* Pending partial lines and continuation *
*****************************************************************/
otherwise
do
map = map || substr(bms.b, 16, 56)
end
end
end
map.0 = m
row. = 0
col. = 0
len. = 0
attr. = -1
init. = ''
/*********************************************************************
* Set up the default attribute *
*********************************************************************/
attrs = 'a(ASKIP)' || crlf
a = 1
/*********************************************************************
* Parse out the keywords and their values *
*********************************************************************/
do m = 1 to map.0 until pos('DFHMSD TYPE=FINAL', space(map.m)) \= 0
smap = space(map.m)','
/*******************************************************************
* Get the size *
*******************************************************************/
if pos('DFH' || 'MDI SIZE=(', smap) \= 0 then
do
parse value smap with . 'SIZE=(' mrow ',' mcol ')' .
mrow = strip(mrow, 'L', '0')
mcol = strip(mcol, 'L', '0')
end
/*******************************************************************
* Get the screen position of the element *
*******************************************************************/
if pos('POS=(', smap) \= 0 then
do
parse value smap with . 'POS=(' row.m ',' col.m ')' .
row.m = right(row.m, length(mrow), '0')
col.m = right(col.m, length(mcol), '0')
end
/*******************************************************************
* Get the length of the element *
*******************************************************************/
if pos('LENGTH=', smap) \= 0 then
parse value smap with . 'LENGTH=' len.m ',' .
/*******************************************************************
* Get the screen attributes of the element *
*******************************************************************/
if pos('ATTRB=(', smap) \= 0 then
parse value smap with . 'ATTRB=(' attr.m ')' .
else
if pos('ATTRB=', smap) \= 0 then
parse value smap with . 'ATTRB=' attr.m ',' .
/*******************************************************************
* Build a string of all unique attributes *
*******************************************************************/
if attr.m \= -1 &,
pos('('attr.m')', attrs) = 0 then
do
a = a + 1
attrs = attrs || substr(alpha, a, 1) || '('attr.m')' || crlf
end
/*******************************************************************
* Get any initial value, temporarily replace '' with x'ffff' to *
* allow correct parsing *
*******************************************************************/
if pos('INITIAL=', smap) \= 0 then
do
tmap = map.m
p = pos('''''', tmap)
if p \= 0 &,
pos('INITIAL=''''''', tmap) \= 0 then
p = p + 1
do while p \= 0
tmap = overlay(nulls, tmap, p)
p = pos('''''', tmap)
end
parse value tmap with . 'INITIAL=''' init.m '''' .
end
/*******************************************************************
* Get the colour of the element *
*******************************************************************/
if pos('COLOR=', smap) \= 0 then
do
parse value smap with . 'COLOR=' color ',' .
ch.m = value('color.0'color)
end
/*******************************************************************
* Get the highlighting of the element *
*******************************************************************/
if pos('HILIGHT=', smap) \= 0 then
do
parse value smap with . 'HILIGHT=' hilite ',' .
ch.m = overlay(value('hilite.0'hilite), ch.m, 1)
end
end
mrow. = -1
mcol. = -1
mlen. = -1
mattr. = -1
minit. = '_'
qrow. = ''
arow. = ''
r = -1
do i = 1 to map.0
/*******************************************************************
* Skip empty rows *
*******************************************************************/
if row.i = 0 then
iterate i
/*******************************************************************
* Multiple fields per row *
*******************************************************************/
if r = row.i + 0 then
ri = ri + 1
else
do
r = row.i + 0
ri = 1
end
/*******************************************************************
* Un-double quotes *
*******************************************************************/
tinit = init.i
p = pos(nulls, tinit)
do while p\= 0
parse value tinit with p1 (nulls) p2
tinit = p1''''p2
p = pos(nulls, tinit)
end
/*******************************************************************
* Get attribute (default = 'ASKIP') *
*******************************************************************/
if attr.i = -1 then
a = 'a'
else
a = substr(attrs, pos('('attr.i')', attrs) - 1, 1)
/*******************************************************************
* Set field to either the initial value, or underscores *
*******************************************************************/
if tinit \= '' then
qrow.r = left(qrow.r, col.i) || left(tinit, len.i)
else
qrow.r = left(qrow.r, col.i) || left('_', len.i, '_')
/*******************************************************************
* Build attribute line *
*******************************************************************/
arow.r = left(arow.r, col.i) || left(a, len.i, a)
/*******************************************************************
* Save element data for possible future processing *
*******************************************************************/
mrow.r.ri = row.i
mcol.r.ri = col.i
mlen.r.ri = right(len.i, 2, '0')
if attr.i \= -1 then
mattr.r.ri = attr.i
else
mattr.r.ri = 'ASKIP'
if init.i \= '' then
minit.r.ri = ''''init.i''''
else
minit.r.ri = ''
end
/*********************************************************************
* Build output dataset - two copies, normal and with attributes *
*********************************************************************/
mapds = 'bms' || random(99999)
"alloc f("mapds") new delete reu " ||,
"unit(sysda) " ||,
"space(1,1) tracks release " ||,
"recfm(f b) lrecl("mcol + 2") blksize(0) dsorg(ps) "
"newstack"
/*********************************************************************
* "Screen image" *
*********************************************************************/
queue left(cols, mcol)' '
do i = 1 to mrow
queue left(qrow.i, mcol) || right(i, 2, '0')
end
queue left(cols, mcol)' '
/*********************************************************************
* Screen characteristics *
*********************************************************************/
queue 'Rows :' mrow
queue 'Columns :' mcol
attr = attrs
do a = 1 by 1 while attr \= ''
parse value attr with id =2 at (crlf) attr
queue 'Attribute:' id '-' at
end
queue left(cols, mcol)' '
/*********************************************************************
* "Screen image" with attribute characters *
*********************************************************************/
do i = 1 to mrow
queue left(qrow.i, mcol) || right(i, 2, '0')
queue left(arow.i, mcol) || right(i, 2, '0')
end
queue left(cols, mcol)' '
"execio" queued() "diskw" mapds "(finis"
"ispexec lminit dataid(mydsn) ddname("mapds") enq(exclu)"
"ispexec browse dataid("mydsn")"
"ispexec lmfree dataid("mydsn")"
"free f("mapds")"
return
/***********************************************************************
* SCREEN_2_BMS: *
* *
* Convert an "extended screen image" to BMS macros *
***********************************************************************/
screen_2_bms:
zedsmsg = ''
zedlmsg = 'The "Screen to BMS" option is not yet implemented'
"ispexec setmsg msg(ISRZ001)"
return
/***********************************************************************
* BMS_2_ISPF: *
* *
* Convert an "extended screen image" to BMS macros *
***********************************************************************/
bms_2_ispf:
zedsmsg = ''
zedlmsg = 'The "BMS to ISPF panel" option is not yet implemented'
"ispexec setmsg msg(ISRZ001)"
return
/***********************************************************************
* HELP: *
* *
* HELP is a general "help" screen displaying routine *
***********************************************************************/
help:
arg parm
i = h.0i
text = 'The' moi 'edit macro'
line.i = center(text, 72)
type.i = 'MSG'
i = i + 1
line.i = center(left('~', length(text), '~'), 72)
type.i = 'MSG'
i = i + 1
line.i = center(' Use DOWN to read all "HELP"',
'screens ', 72, '*')
type.i = 'MSG'
i = i + 2
line.i = ' The' moi 'edit macro can be used to convert a set of BMS',
'macros to'
i = i + 1
line.i = ' a pseudo "screen image.'
/*********************************************************************
i = i + 2
line.i = ' The' moi 'edit macro can be used to'
i = i + 2
line.i = ' - convert a set of BMS macros to a pseudo "screen',
'image", or'
i = i + 1
line.i = ' - a pseudo "screen image" (+ additional meta-data) to',
'a set of BMS'
i = i + 1
line.i = ' macros'
*********************************************************************/
i = i + 2
line.i = ' Usage - BMS macros to "screen image"'
type.i = 'MSG'
i = i + 2
line.i = ' 1) View (or edit) a dataset/member with BMS macros',
'for a screen'
i = i + 1
line.i = ' 2) Give the command "'moi' SCREEN"'
i = i + 2
line.i = ' Note:'
type.i = 'MSG'
i = i + 2
line.i = ' If the dataset/member contains more than one screen,',
'it is'
i = i + 1
line.i = ' necessary to bracket the set of macros that describe',
'the screen'
i = i + 1
line.i = ' to be rendered. The following four options can be',
'used to do so:'
i = i + 2
line.i = ' a) invoke the macro as "'moi' SCREEN n", where ''n''',
'is the number'
i = i + 1
line.i = ' of the screen in the source that needs to be',
'selected, OR'
i = i + 2
line.i = ' b) place any label on the line containing the',
'''DFHMDI'' macro that'
i = i + 1
line.i = ' defines the screen-size, and another label on',
'the final'
i = i + 1
line.i = ' (continuation-)line that describes the screen, and',
'invoke the'
i = i + 1
line.i = ' macro as "'moi' SCREEN lab1 lab2", where ''lab1''',
'and ''lab2'' are'
i = i + 1
line.i = ' the labels that bracket the selected screen, OR'
i = i + 2
line.i = ' c) place a ''.BMSF'' label on the line containing the',
'''DFHMDI'' macro'
i = i + 1
line.i = ' that defines the screen-size, and a ''.BMSL'' label',
'on the final'
i = i + 1
line.i = ' (continuation-)line that describes the screen, OR'
i = i + 2
line.i = ' d) place a ''BMSS'' line command on the line',
'containing the ''DFHMDI'''
i = i + 1
line.i = ' macro that defines the screen-size, and another on',
'the final'
i = i + 1
line.i = ' (continuation-)line that describes the screen.'
i = i + 2
line.i = ' The first and second options are very useful for',
'repeated execution'
i = i + 1
line.i = ' of' moi 'on a source containing two (or more)',
'''screens''.'
i = i + 2
line.i = ' The result will be a Browse of a temporary dataset',
'containing two'
i = i + 1
line.i = ' "screen images",'
i = i + 2
line.i = ' - a normal one, with all non-INITIAL fields represented',
'by ''_''s'
i = i + 1
line.i = ' - an extended one that lists all unique field-attribute',
'characters'
i = i + 1
line.i = ' and follow each "normal" line of the "screen image"',
'with a line'
i = i + 1
line.i = ' containing the attribute for the field'
i = i + 2
line.i = center(' End of HELP information ', 72, '*')
type.i = 'MSG'
line.0 = i
call message
return
/***********************************************************************
* MESSAGE is a general purpose edit message insertion routine *
***********************************************************************/
message:
"isredit (STATE) = user_state"
"isredit caps = off"
do i = line.0 to 1 by -1
lin = line.i
"isredit line_after "dest" = "type.i"line (LIN)"
end
"isredit user_state = (STATE)"
"isredit locate" dest
return
Robert
--
Robert AH Prins
robert dot ah dot prins on gmail