Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

BMS to CICS green screen

74 views
Skip to first unread message

Graham Hobbs

unread,
Oct 22, 2009, 11:01:55 PM10/22/09
to
Hello,
Given any old BMS (e.g. below), is there any REXX out there that could
'paint' a green screen so it looks like what one would see on a CICS
terminal. Sorry about the formatting, I don't know how to do it.

* 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

Robert AH Prins

unread,
Oct 24, 2009, 6:43:41 AM10/24/09
to
"Graham Hobbs" <gho...@cdpwise.net> wrote in message
news:fi62e51ojj50d25dt...@4ax.com...

> Hello,
> Given any old BMS (e.g. below), is there any REXX out there that could
> 'paint' a green screen so it looks like what one would see on a CICS
> terminal. Sorry about the formatting, I don't know how to do it.

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


Graham Hobbs

unread,
Oct 28, 2009, 11:07:00 AM10/28/09
to
Robert,
My thanks, I will take a close look at this on my daily trip to Tim
Horton's (that's Canadian coffee shop chain!).
Cheers
Graham
0 new messages