home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1993 #3 / NN_1993_3.iso / spool / comp / database / informix / 3042 < prev    next >
Encoding:
Internet Message Format  |  1993-01-24  |  49.1 KB

  1. Path: sparky!uunet!gatech!emory!emory!not-for-mail
  2. From: obelix.informix.com!johnl@emory.mathcs.emory.edu (Jonathan Leffler)
  3. Newsgroups: comp.databases.informix
  4. Subject: I4GL Modifications: Part 2 of 3
  5. Date: 23 Jan 1993 23:28:05 -0500
  6. Organization: Mailing List Gateway
  7. Lines: 1052
  8. Sender: walt@mathcs.emory.edu
  9. Distribution: world
  10. Message-ID: <1jt5slINNjen@emory.mathcs.emory.edu>
  11. Reply-To: obelix.informix.com!johnl@emory.mathcs.emory.edu (Jonathan Leffler)
  12. NNTP-Posting-Host: emory.mathcs.emory.edu
  13. X-Informix-List-ID: <list.1814>
  14.  
  15. #!/bin/sh
  16. # this is part 2 of a multipart archive
  17. # do not concatenate these parts, unpack them in order with /bin/sh
  18. # file i4glmods continued
  19. #
  20. CurArch=2
  21. if test ! -r s2_seq_.tmp
  22. then echo "Please unpack part 1 first!"
  23.      exit 1; fi
  24. ( read Scheck
  25.   if test "$Scheck" != $CurArch
  26.   then echo "Please unpack part $Scheck next!"
  27.        exit 1;
  28.   else exit 0; fi
  29. ) < s2_seq_.tmp || exit 1
  30. echo "x - Continuing file i4glmods"
  31. sed 's/^X//' << 'SHAR_EOF' >> i4glmods
  32. X    containing problem records which are apparently out of sequence.  The
  33. X    program name has been placed on the second line, and so has the
  34. X    function name where the error occurred.
  35. X
  36. XDate: 1993-01-21 15:57:41 GMT  User: johnl     TTY: /dev/console  PID:  3129
  37. XProgram: rrr.4go  Error at "rrr.4gl", line number 7 in function "main".
  38. XFORMS statement error number -1110.
  39. XForm file not found
  40. X
  41. X    I4GL-L23 was rated in class B because it is easy to fix.
  42. X
  43. XI4GL-L24:
  44. X    It would be useful to have a bottom tested loop:
  45. X
  46. X        REPEAT
  47. X            <statements>
  48. X        UNTIL <condition>
  49. X
  50. X    Even C, a minimalist language, provides a bottom tested loop, because
  51. X    there are times when the algorithm requires the loop body to be
  52. X    executed once.
  53. X
  54. X    I4GL-L24 was rated in class B because it should be easy to implement.
  55. X
  56. XI4GL-L25:
  57. X    Because I4GL isn't like C, it is relatively difficult to write out a
  58. X    FOREACH loop which needs a USING clause cleanly.  I4GL-S01 fixes that,
  59. X    but there are other places where a N-plus-a-half iteration loop would
  60. X    be useful.  The loop mght look like:
  61. X
  62. X            DO
  63. X                FETCH c_cursor INTO varlist.*
  64. X            WHILE STATUS = 0
  65. X                OUTPUT TO REPORT r_report(varlist.*)
  66. X            END DO
  67. X
  68. X    If we adding loops to I4GL, then maybe an UNTIL/END UNTIL loop
  69. X    and a DO/UNTIL/END DO loop are both appropriate too.
  70. X
  71. X    I4GL-L25 was rated in class C because it is not provided by any other
  72. X    language (though Ada and PL/I get close).
  73. X
  74. XI4GL-L26:
  75. X    The underlying representation of DATE variables is an integer type, but
  76. X    you cannot loop over the days between two dates unless you use a
  77. X    circumlocution like the code below.  I4GL should allow the use of a
  78. X    DATE variable as the index of a FOR loop.
  79. X
  80. X    MAIN
  81. X
  82. X        DEFINE
  83. X            d, d1, d2   DATE,
  84. X            i, j, k     INTEGER
  85. X
  86. X        LET d1 = MDY(01, 01, 1993)
  87. X        LET d2 = MDY(01, 31, 1993)
  88. X
  89. X        LET i = d1
  90. X        LET j = d2
  91. X        FOR k = i TO j
  92. X            LET d = DATE(k)
  93. X            DISPLAY "Date: ", d USING "ddd dd mmm yyyy" AT 3, 1
  94. X            SLEEP 1
  95. X        END FOR
  96. X
  97. X    END MAIN
  98. X
  99. X    Incidentally, it would be useful if there was an explicit coercion
  100. X    function called INTEGER to coerce a DATE into an INTEGER.  The
  101. X    statement: LET j = INTEGER(d2) is clearer documentation of the fact
  102. X    that something slightly peculiar is going on.
  103. X
  104. X    I4GL-L26 was rated in class A because it is should be easy to fix.
  105. X
  106. XI4GL-L27:
  107. X    The mapping of function keys to purposes needs to be less direct.  This
  108. X    is so that when the customer decides that the help key should no longer
  109. X    be the key labelled HELP but the key labelled F1, the mapping can be
  110. X    done in software, preferably without either recompiling the software or
  111. X    rewriting the termcap/terminfo entry so it is a bundle of fibs.  If
  112. X    recompilation is forced on us, at least using a bunch of macro names
  113. X    such as KEY_HELP, KEY_ACCEPT, KEY_QUIT, etc. allows the mapping to be
  114. X    altered by simply changing the central header file which defines these
  115. X    mappings (I4GL-L16).  Then, of course, the vastly upgraded programmers
  116. X    environment (I4GL-T05) can be told to recompile all the software
  117. X    affected by the change, and at least everything is consistent.  If the
  118. X    source would have to be edited instead, then it becomes simpler to lie
  119. X    through your teeth by rewriting the termcap entry so that the key
  120. X    defined as k0 (F1 in I4GL parlance, F10 anywhere else) is deemed to
  121. X    produce the sequence associated the key labelled F6 because the help
  122. X    key in the source code was assumed to be F1 (and the source is
  123. X    unchanged) but the users now hit the key labelled F6 instead.
  124. X
  125. X    I4GL-L27 was rated in class C because it is can be largely fixed by
  126. X    other requests, such as I4GL-L28, I4GL-L16.
  127. X
  128. XI4GL-L28:
  129. X    Cursors, windows, forms, colour attributes, key names, field names
  130. X    should all be treated as proper variables.  This would simplify many
  131. X    operations.  For example, one of the systems I was working on recently
  132. X    had a requirement for a screen array where the entries in the screen
  133. X    array needed to be of different lengths depending on the amount of
  134. X    information to be shown for the entry.  It is not sensible to try
  135. X    upgrading INPUT ARRAY to handle that, but an ARRAY[8] OF WINDOW would
  136. X    have simplified a lot of coding, as would the ability to use DISPLAY
  137. X    Forty_odd_fields.* TO s_record.* ATTRIBUTE(attr_var) where attr_var was
  138. X    a colour attribute variable holding either REVERSE or NORMAL.  Maybe
  139. X    the forms weren't designed correctly (and, once more, time was of the
  140. X    essence), but using the 4.10 OPTIONS DISPLAY ATTRIBUTE (NORMAL) didn't
  141. X    do what was required, which was to override the colours in the form.
  142. X
  143. X    This change is fundamental to a number of the changes in the sections on
  144. X    handling forms, windows, INPUT, DISPLAY ARRAY and INPUT ARRAY.
  145. X
  146. X    I4GL-L28 was rated in class C because it is important but difficult to
  147. X    do properly.
  148. X
  149. XI4GL-L29:
  150. X    There should be a mechanism which allows a user to define symbolic
  151. X    constants.  This can either be provided by the preprocessor facility
  152. X    (I4GL-L16) or by a constant declaration.  Either way, it is crucial
  153. X    that the constant value can be computed from other constants if need
  154. X    be, so that two arrays can declared, one with size N and the other with
  155. X    size 2*N, and when N changes, only that constant definition has to be
  156. X    altered.  Bear in mind that the constants may be defined in different
  157. X    source files, using a common header file which contains the definition
  158. X    of N.  If computed constants cannot be handled in declarations, then
  159. X    the preprocessor must provide a mechanism to evaluate an expression on
  160. X    demand (as in the M4 macro processor).
  161. X
  162. X    With the ability to pass arrays around (I4GL-L03), it would be helpful
  163. X    if I4GL provided a function such as dimensionof() to determine the
  164. X    number of elements in an array.  If generic sorting routines (analogous
  165. X    to qsort(3) are to be written, then it is necessary to have a function
  166. X    analogous to sizeof(), and offsetof() might not go amiss while were at
  167. X    it.  These would be of little direct relevance to the I4GL programmer,
  168. X    but would make the interface to C routines simpler in certain contexts.
  169. X
  170. X    I4GL-L29 was rated in class A because the constant facility would simplify
  171. X    the maintenance of programs immensely.  The xxxxof() routines are less
  172. X    critical.
  173. X
  174. XI4GL-L30:
  175. X    A suggestion tacked onto the end of someone's e-mail message said that
  176. X    I4GL should provide full object-orientated support.  Some of what this
  177. X    would imply have been discussed alread (notably in I4GL-L05), but
  178. X    allowing for C++ classes and inheritance (multiple inheritance) and so
  179. X    on would need most of the features discussed so far and a good few
  180. X    extras not discussed.  However, it would be better to get the basic 3GL
  181. X    features sorted out before trying to create I4GL++.
  182. X
  183. X    I4GL-L30 was rated in class B because it is likely to very important in
  184. X    the future, whether or not you also get nice things like a GUI
  185. X    interface.
  186. X
  187. XI4GL-L31:
  188. X    In ANSI C, the strings written as "ABC" "DEF" are treated as if they
  189. X    had been written "ABCDEF".  When the strings are that short, there is
  190. X    little advantage to it, but if you look at the sample code below, you
  191. X    will see how it makes writing complex SELECT statements as literal
  192. X    strings for PREPARE much easier, and avoid having to define a variable
  193. X    simply to concatenate some constant strings together before handing
  194. X    them off to a PREPARE statement.  It would also avoid the problems with
  195. X    the defined variable turning out to be too short for the concatenated
  196. X    string.
  197. X
  198. X    Old style:
  199. X        DEFINE
  200. X            brain_damaged   CHAR(256)
  201. X        LET brain_damaged =
  202. X                "SELECT T1.Col01 Column1, T1.Col03 Column2,",
  203. X                " T2.Col19 Column3, T2.Col05 Column4, T2.Col01 Column5",
  204. X                " FROM TableA T1, TableB T2",
  205. X                " WHERE T1.Col02 = T2.Col04",
  206. X                " ORDER BY Column1, Column2, Column5"
  207. X        PREPARE p_stmt FROM brain_damaged
  208. X        DECLARE c_stmt CURSOR FOR p_stmt
  209. X
  210. X    New style:
  211. X        PREPARE p_stmt FROM
  212. X                "SELECT T1.Col01 Column1, T1.Col03 Column2,"
  213. X                " T2.Col19 Column3, T2.Col05 Column4, T2.Col01 Column5"
  214. X                " FROM TableA T1, TableB T2"
  215. X                " WHERE T1.Col02 = T2.Col04"
  216. X                " ORDER BY Column1, Column2, Column5"
  217. X        DECLARE c_stmt CURSOR FOR p_stmt
  218. X
  219. X    I4GL-L31 was rated in class A because it should be easy to implement.
  220. X
  221. XI4GL-L32:
  222. X    In general, languages should allow defaults to be declared explicitly
  223. X    as well as implicitly.  Even C does this -- you can declare an auto
  224. X    variable, even though no-one ever does.  This modification affects lots
  225. X    of things, but generally only in minor ways, such as:
  226. X
  227. X    OnLine should allow you to say:
  228. X        CREATE DATABASE xxx WITH UNBUFFERED LOG;
  229. X        CREATE DATABASE xxx WITH BUFFERED LOG;
  230. X
  231. X    Reports should allow you to say:
  232. X        ORDER INTERNAL BY var1, var2
  233. X        ORDER EXTERNAL BY var1, var2
  234. X
  235. X    Windows should allow you to say:
  236. X        OPEN WINDOW w_window AT 2, 2 WITH 4 ROWS, 40 COLUMNS
  237. X            ATTRIBUTE(NO BORDER)
  238. X        OPEN WINDOW w_window AT 2, 2 WITH 4 ROWS, 40 COLUMNS
  239. X            ATTRIBUTE(BORDER)
  240. X
  241. X    INPUT and INPUT ARRAY should allow you to say:
  242. X        INPUT varlist BY NAME WITHOUT DEFAULTS
  243. X        INPUT varlist BY NAME WITH DEFAULTS
  244. X
  245. X    I4GL-L32 was rated in class B because it involves a lot of changes and
  246. X    therefore isn't necessarily all that easy to implement.
  247. X
  248. XI4GL-L33:
  249. X    It would be useful if I4GL provided an ELSIF (or ELIF, but not ELSEIF
  250. X    because that could too easily be confused with a nested IF statement in
  251. X    an ELSE clause) option to allow a sequence of tests to be coded as IF
  252. X    statements, instead of having to continually convert IF/ELSE into
  253. X    CASE/WHEN.
  254. X
  255. X        IF <condition> THEN <stmts>
  256. X      [ ELSIF <condition> THEN <stmts> ...  ]
  257. X      [ ELSE <stmts> ]
  258. X        END IF
  259. X
  260. X    I4GL-L33 was rated in class A because it should be simple to do.
  261. X
  262. XI4GL-L34:
  263. X    The USING clause is good for dealing with numbers which are not too
  264. X    large or too small (eg money quantities).  Sometimes the numbers are
  265. X    much bigger and there is no mechanism to control the format of decimal
  266. X    number (or float or smallfloat or money) when the value should be
  267. X    printed in exponential notation.  Facilities analogous to either the
  268. X    Fortran format specifiers or to the printf format specifiers should be
  269. X    provided to do this.  What about:
  270. X
  271. X        str = dec_sprintf("%13.6g", dec_val)
  272. X
  273. X    I4GL-L34 was rated in class C because it should be simple to do and
  274. X    useful but there has not been much demand voiced for it.
  275. X
  276. XI4GL-L35:
  277. X    John Oliver (no email address) asked: How about dynamic use of I4GL
  278. X    call command so that the programmer could say: "call func_name" where
  279. X    func_name is a char variable storing the name of a function.  Under the
  280. X    current I4GL, this is impossible.  The best you can do us use the run
  281. X    command to run named stand alone executables.
  282. X
  283. X    Girard Chandler (girard@informix.com) responded: I4GL sort of supports
  284. X    this.  See "fgl_call(char *funcname, int nparams)" in pages S-198 ->
  285. X    S-212 of the 4.1 4GL supplement.  This compiles to:
  286. X
  287. X        p4gl_call("funcname", nparams)  -- R4GL
  288. X        funcname(nparams)               -- C4GL
  289. X
  290. X    So, using a very short C function with 4gl-rds, you can call functions
  291. X    "by name." In C4GL the only method to do this would be to create a
  292. X    lookup table of strings and function pointers.  In R4GL, you can load
  293. X    individual pcode files dynamically and execute them (see the
  294. X    fgl_start() function, page S-207).
  295. X
  296. X    fgl_call is not an I4GL-level facility, so it is not a complete answer
  297. X    to John Oliver's question.  However, defining a suitable mechanism for
  298. X    passing arguments to (and getting values back from) a function called
  299. X    by name would need to be decided carefully.  The obvious solution is to
  300. X    allow the argument list and return values to be specified as for any
  301. X    other call; the only novel thing would be the use of a variable
  302. X    (string?) to indicate the function to be called.  This is then exactly
  303. X    analogous to the C call by pointer to function.  Another issue would be
  304. X    how to obtain a mapping between function names and function pointers.
  305. X    This would probably be more troublesome.
  306. X
  307. X    I4GL-L35 was rated in class D because it is not clear whether there is a
  308. X    significant demand for this sort of capability.
  309. X
  310. X----------------------------------------------------------------------
  311. X
  312. XSQL
  313. X
  314. XI4GL-S01:
  315. X    The FOREACH loop is very useful provided that the cursor it iterates over
  316. X    does not need a USING clause when the cursor is opened.  This is a
  317. X    ludicrous oversight, and a confounded nuisance, not least because it ought
  318. X    to be trivial to fix.  The FOREACH loop should be extended to allow the
  319. X    syntax:
  320. X
  321. X        FOREACH c_cursor [ USING variablelist-1 ] [ INTO variablelist-2 ]
  322. X
  323. X    I4GL-S01 was rated in class A because it should be easy to implement.
  324. X
  325. XI4GL-S02:
  326. X    The existing version of I4GL does not allow recursive algorithms which
  327. X    need to use different cursors with each new nested invocation because
  328. X    there is no way to provide cursor variables -- the names are fixed.
  329. X    ESQL/C Version 5.00 provides support for cursors named by strings,
  330. X    which should be added to I4GL, partly in response to I4GL-L28, partly
  331. X    because the underlying ESQL supports it (and the engines do), and
  332. X    partly because the functionality is needed.
  333. X
  334. X    I4GL-S02 was rated in class B because it should be easy to implement.
  335. X
  336. XI4GL-S03:
  337. X    A couple of the messages in the CDI discussion mention the idea of
  338. X    providing an INPUT CURSOR and a DISPLAY CURSOR facility, but I have no
  339. X    detailed description of the features available.
  340. X
  341. X    I am not at all clear how an INPUT CURSOR should work.  A DISPLAY
  342. X    CURSOR may be intended to be similar to DISPLAY ARRAY except that the
  343. X    data to be operated on is defined by a cursor of some sort, and the
  344. X    programmer would not have to provide the data space.  I think this is
  345. X    supplanted by the PICKLIST statement (I4GL-K01) documented below, but I
  346. X    may have got hold of completely the wrong idea.
  347. X
  348. X    I4GL-S03 was rated in class E because there is insufficient available
  349. X    infomration about what the requirement is.
  350. X
  351. XI4GL-S04:
  352. X    One of the initial requests in the CDI discussion was for the facility
  353. X    to be able to do:
  354. X
  355. X        CREATE TEMP TABLE LIKE record.*
  356. X
  357. X    Presumably, you should also be able to do:
  358. X
  359. X        CREATE TEMP TABLE LIKE var1, var2, rec1.field3 THRU rec1.field7
  360. X
  361. X    I argued against this suggestion; I don't seem to have a record of the
  362. X    discussion (over-zealous cleaning out of mail files).  I would now
  363. X    argue against it on the grounds that it is putting the cart before the
  364. X    horse.  I4GL supplies the abilty to define records like tables which is
  365. X    appropriate because it is designed to handle databases.  However, when
  366. X    a temporary table is created, you should already know what it will look
  367. X    like and therefore the facility seems redundant.  However, the CREATE
  368. X    TEMP TABLE LIKE statement would presumably translate the variable types
  369. X    into appropriate database types and translate the statement into a
  370. X    normal CREATE TEMP TABLE statement.  As such, it can do no harm, but I
  371. X    remain to be convinced of its value.
  372. X
  373. X    I4GL-S04 was rated in class E because the need for it is not clearly
  374. X    understood.
  375. X
  376. XI4GL-S05:
  377. X    Another of the initial requests in the CDI discussion was for the
  378. X    facility to be able to do:
  379. X
  380. X    UPDATE Table01 SET r_var.* BY NAME
  381. X        WHERE <condition>
  382. X
  383. X    This is a shorthand for:
  384. X
  385. X        UPDATE Table01
  386. X            SET Col01 = r_var.col01,
  387. X                Col02 = r_var.col02,
  388. X                Col03 = r_var.col03
  389. X            WHERE <condition>
  390. X
  391. X    There should presumably also be support for:
  392. X
  393. X    UPDATE Table01 SET var1, var2, r_var3.col4 THRU r_var3.col7 BY NAME
  394. X        WHERE <condition>
  395. X
  396. X    I argued against this suggestion, but I don't seem to have a record of
  397. X    the discussion (over-zealous cleaning out of mail files).  I now think
  398. X    I was mistaken in the argument; it provides a potentially useful
  399. X    shorthand, even though I have never found an urgent need for it.
  400. X
  401. X    I4GL-S05 was rated in class E because I remain to be convinced of it
  402. X    general usefulness.
  403. X
  404. XI4GL-S06:
  405. X    Hugh Grierson (hugh@nezsdc.icl.co.uk) noted that there is a
  406. X    "mismatch between semantics of some 4GL and SQL language constructs".
  407. X    Paraphrasing his example slightly, consider the code segment:
  408. X
  409. X         DEFINE r_tab01 RECORD LIKE Table01.*       -- 1
  410. X         SELECT *                                   -- 2
  411. X             INTO r_tab01.*                         -- 1
  412. X             FROM Table01
  413. X
  414. X    The stars in the lines marked 1 are expanded to the list of columns at
  415. X    compile time, whereas the star in the lines marked 2 is expanded at run
  416. X    time.  This is a correct observation, and can lead to trouble if the Table01
  417. X    is altered between the time when the program is compiled and when it is
  418. X    run.  Usually, the problem is obvious because the program crashes, but it
  419. X    could be more subtle and simply cause the program to misbehave.  If you
  420. X    look at books on database design, you find they uniformly recommend that
  421. X    you avoid the use of star precisely because the meaning of star can
  422. X    change.
  423. X
  424. X    I4GL-S06 was rated in class F because to change it would fundamentally
  425. X    alter the nature of I4GL, and it would not be easy to provide a
  426. X    suitable facility to deal with this.
  427. X
  428. X----------------------------------------------------------------------
  429. X
  430. XREPORTS
  431. X
  432. XI4GL-R01:
  433. X    It should be possible to specify the shape of the report output page as
  434. X    well as the destination when the report is started.  The preferred
  435. X    mechanism for doing this would be something like:
  436. X
  437. X    START REPORT reportname
  438. X           [ TO { SCREEN | PRINTER | FILE "file" | "file" | PIPE "program" } ]
  439. X           [ WITH { PAGE LENGTH n | TOP MARGIN n |
  440. X               BOTTOM MARGIN n | LEFT MARGIN n |
  441. X               RIGHT MARGIN n } [ , ... ] ]
  442. X
  443. X    In this code, all the n's should be integer expressions (according to
  444. X    I4GL-L09).  Both "file" and "program" can be string expressions in the
  445. X    current versions of I4GL, which is good.  Note that the explicit option
  446. X    of specifying TO FILE has been added, retaining the old TO "filename"
  447. X    for backwards compatability.
  448. X
  449. X    This is likely to be fixed by the much less tidy expedient of allowing
  450. X    the values in the OUTPUT section of the report be global integer
  451. X    variables.  The values used will be those current when the START REPORT
  452. X    statement is executed.  Forcing the programmer to use of globals is
  453. X    distasteful.
  454. X
  455. X    I4GL-R01 was rated in class A because it is desparately needed.
  456. X
  457. XI4GL-R02:
  458. X    This is the other bug fix -- misfeature fix -- which ought to be made.
  459. X    In an I4GL report (or, indeed, in an ACE report), you cannot have two
  460. X    fields printed with WORDWRAP on the same row.  For example, suppose
  461. X    there are two long CHAR fields which should be printed wordwrapped
  462. X    side-by-side.
  463. X
  464. X        PRINT   COLUMN  1, intval01 USING "####&",
  465. X                COLUMN 10, longchar01 WORDWRAP RIGHT MARGIN 35,
  466. X                COLUMN 40, longchar02 WORDWRAP RIGHT MARGIN 65,
  467. X                COLUMN 70, intval02 USING "#####&"
  468. X
  469. X    The effect should be:
  470. X
  471. X  1234   This is the text from         This is the text from           5432
  472. X         longchar01 wordwrapped in     longchar02, also
  473. X         a width of 25 characters      wordwrapped in a width of
  474. X         (35-10).                      25 characters (though the
  475. X                                       limiting columns this
  476. X                                       time are 40 and 65).
  477. X
  478. X    The effect you actually get is shown below, which make wordwrapped
  479. X    fields in reports very limited in value.
  480. X
  481. X  1234   This is the text from
  482. X         longchar01 wordwrapped in
  483. X         a width of 25 characters
  484. X         (35-10).                      This is the text from
  485. X                                       longchar02, also
  486. X                                       wordwrapped in a width of
  487. X                                       25 characters (though the
  488. X                                       limiting columns this
  489. X                                       time are 40 and 65).            5432
  490. X
  491. X    I4GL-R02 was rated in class A because it is desparately needed.
  492. X
  493. XI4GL-R03:
  494. X    There was a request for it to be possible to send the output of a
  495. X    report to an I4GL window.  The window should provide a scrolling
  496. X    capability, definitely vertically and possibly horizontal as well if
  497. X    the report output is wider than the window.  This is likely to use the
  498. X    same sort of technology as the horizontally scrolling character fields
  499. X    (I4GL-F05), and would probably benefit from the search facility
  500. X    proposed for display arrays (I4GL-D04) too.
  501. X
  502. X    Possible syntax for using this:
  503. X
  504. X        START REPORT reportname
  505. X            TO WINDOW w_window
  506. X            [ WITH PAGE LENGTH .... ]
  507. X
  508. X    This syntax requires the window to be pre-opened.  Alternatively, it
  509. X    might be nice if an anonymous window could be created on the fly.  This
  510. X    would require a syntax such as:
  511. X
  512. X        START REPORT reportname
  513. X            TO WINDOW AT x, y WITH r ROWS, c COLUMNS ATTRIBUTE (BORDER)
  514. X            [ PAGE LENGTH .... ]
  515. X
  516. X    I4GL-R03 was rated in class D because it is likely to be hard to implement
  517. X    and it is not clear how widely used it would be.  Feedback please.
  518. X
  519. XI4GL-R04:
  520. X    It would occasionally be useful to be able to have multiple concurrent
  521. X    invocations of a single report.  An example would be when an invoice is
  522. X    being printed to the screen and to a printer (using the dynamic
  523. X    configuration facilities of I4GL-R01, of course to ensure that the
  524. X    report dimensions are appropriate).
  525. X
  526. X    However, to support this, some equivalent to a FILE structure in C
  527. X    (call it a report handle) would be necessary to identify which
  528. X    invocation of the report was being referred to.  This would completely
  529. X    mess up the existing language unless a default value of a report handle
  530. X    could be inferred from the fact that only one copy of the report was
  531. X    active on an existing system.
  532. X
  533. X    I4GL-R01 was rated in class F because it is not easy to implement it
  534. X    without completely reworking the way reports are used, which is likely
  535. X    to break existing code.
  536. X
  537. XI4GL-R05:
  538. X    It would nice to be able to suppress trailing blank lines on the end of
  539. X    a report when required.  This would be particularly useful when the
  540. X    output is going to be mailed.  It would also be useful if trailing
  541. X    blanks could be suppressed on all report output, though constant width
  542. X    output is occasionally useful (for example if two reports are going to
  543. X    be pasted together -- electronically by paste(1)).  A suitable syntax
  544. X    for this might be:
  545. X
  546. X        OUTPUT
  547. X            { WITH | WITHOUT } TRAILING LINES
  548. X            { WITH | WITHOUT } TRAILING BLANKS
  549. X
  550. X    I4GL-R05 was rated in class C because it might not be all that easy to do
  551. X    and it is not unbearable.
  552. X
  553. X----------------------------------------------------------------------
  554. X
  555. XMENUS
  556. X
  557. XI4GL-M01:
  558. X    Ring menus are great when working with a screen form because they don't
  559. X    take up much screen space, but for navigating around an application,
  560. X    practically everyone prefers vertical menus, and practically everyone
  561. X    has their own system for handling them.  It might be nice if there was
  562. X    a variant on the MENU (presumably a VERTICAL MENU) which supplied a
  563. X    VERTICAL menu by default.
  564. X
  565. X    However, such a facility is not necessary if the other modifications
  566. X    proposed (especially fgl_getkey() -- I4GL-L10) were available.
  567. X
  568. X    I4GL-M01 was rated in class E because there is no clear requirement for
  569. X    it given the other facilities added.
  570. X
  571. X----------------------------------------------------------------------
  572. X
  573. XPROMPT
  574. X
  575. XI4GL-P01:
  576. X    PROMPT should include EXIT PROMPT and CONTINUE PROMPT.  The ON KEY
  577. X    clauses can only exit from PROMPT if it is wrapped in some sort of
  578. X    loop, whereas consistency suggests that both EXIT and CONTINUE should
  579. X    be provided.
  580. X
  581. X    I4GL-P01 was rated in class A because it should be easy to implement.
  582. X
  583. XI4GL-P02:
  584. X    PROMPT should include BEFORE PROMPT and AFTER PROMPT, again for
  585. X    consistency with the other major statements.
  586. X
  587. X    I4GL-P02 was rated in class A because it should be easy to implement.
  588. X
  589. XI4GL-P03:
  590. X    PROMPT should provide validation of data without requiring special
  591. X    error handling techniques.  When the data type is not CHAR, the value
  592. X    typed by the user is not validated sensibly; if the value cannot be
  593. X    converted, an error is generated.  To recover, the PROMPT has to be
  594. X    wrapped in some sort of loop, which is messy.
  595. X
  596. X    I4GL-P03 was rated in class A because it should have been fixed long
  597. X    ago.
  598. X
  599. XI4GL-P04:
  600. X    It should be possible to use a construct such as:
  601. X
  602. X        PROMPT "Password: " FOR passwd WITHOUT ECHO
  603. X
  604. X    to get a password without the users response appearing on the screen.
  605. X    Again, the only reliable way around this at the moment is to wrap the
  606. X    PROMPT in a loop.
  607. X
  608. X    I4GL-P04 was rated in class A because it should be easy to implement.
  609. X
  610. X----------------------------------------------------------------------
  611. X
  612. XFORMS
  613. X
  614. XI4GL-F01:
  615. X    It would be useful if I4GL forms could be extended to allow for
  616. X    multi-screen input with a single screen record which spans multiple
  617. X    screen layouts -- as supported by ISQL.  It is possible to provide the
  618. X    seamless transfer from the bottom of one screen to the top of the next,
  619. X    and it is considerably more difficult but still possible to provide a
  620. X    seamless transfer from the top of one screen to the bottom of the
  621. X    previous one, but to do so requires reams of code, keeping careful
  622. X    track of where the cursor is and so on.  But it would be so much easier
  623. X    if the language supported it intrinsically.
  624. X
  625. X    This would not require any syntactic changes to the I4GL code, and only
  626. X    semantic changes to the I4GL forms.
  627. X
  628. X    I4GL-F04 was rated in class C because it will probably be rather hard
  629. X    to do properly.
  630. X
  631. XI4GL-F02:
  632. X    The existing syntax for I4GL forms does not distinguish between a
  633. X    word-wrapped field and array elements.  This means that it is not
  634. X    possible to use a word-wrapped field in an array, because the
  635. X    word-wrapped field is deemed to have the wrong dimension compared to
  636. X    the rest of the fields in the array.
  637. X
  638. X    Unfortunately, fixing this is non-trivial, but it is urgently required.
  639. X    The syntax change must try to allow for backward compatability.  Since
  640. X    word-wrapped fields in arrays aren't supported at the moment, then a
  641. X    mechanism should be used which modifies these and allows everything
  642. X    else to be unchanged.  My suggestion is that the field label notation
  643. X    be extended so that the example below shows an array of two
  644. X    word-wrapped fields, each of which has three components.  This notation
  645. X    would be allowed, but not mandatory, on any word-wrapped field,
  646. X    obviously.  If the dot-digit is an annotation, then any un-annotated
  647. X    field which repeats can either be a single word-wrapped field or an
  648. X    array of un-wrapped fields, depending on how the form defines its
  649. X    screen records.
  650. X
  651. X        [f000.1                   ]
  652. X        [f000.2                   ]
  653. X        [f000.3                   ]
  654. X
  655. X        [f000.1                   ]
  656. X        [f000.2                   ]
  657. X        [f000.3                   ]
  658. X
  659. X    Note that this would not allow for an array of word-wrapped fields
  660. X    where each element of the wrapped field was shorter than two
  661. X    characters.  This cannot honestly be regarded as a serious problem, but
  662. X    see I4GL-F03 for more discussion.
  663. X
  664. X    I4GL-F02 was rated in class A because it is urgently required.
  665. X
  666. XI4GL-F03:
  667. X    I4GL (and ISQL) provide no way for making two fields run into each
  668. X    other.  The pipe "|" requires a space between the fields, and using
  669. X    brackets "[]" requires two spaces between fields.  On some forms, some
  670. X    people think it would be helpful to have separate fields run together,
  671. X    particular when a string of single-character codes are being entered.
  672. X    In I4GL, it is possible to handle this (sort of) by defining a single
  673. X    field which takes all the codes and then splits them up after the input
  674. X    has been accepted, but it isn't easy to provide a pop-up facility for
  675. X    the fourth character alone, and a different one for the fifth
  676. X    character.  The ideal solution is to eliminate the need for "[|]"
  677. X    markers in forms.  This is radical as the whole of the form description
  678. X    technology would need to be revised.  While we are at it, we can then
  679. X    fix all the other problems, especially the one addressed by I4GL-F02.
  680. X
  681. X    The technology of forms as currently implemented basically dates back
  682. X    to the very early '80s (and Informix 3.30 and its predecessors), and it
  683. X    was great for that era.  For the '90s, it manages to look dated and
  684. X    needs rewriting.
  685. X
  686. X    I4GL-F03 was rated in class D because it is quite important to bring
  687. X    the technology up to date, but it is a major change.
  688. X
  689. XI4GL-F04:
  690. X    The PICTURE clause is pitifully limited for validating data.  For
  691. X    example, you cannot specify digit or blank for a column unless you
  692. X    allow any character, and you cannot specify a literal A, X or # in the
  693. X    field.  You cannot say that the field must match one of the templates
  694. X    because the PICTURE control what characters can be entered, and
  695. X    literals are skipped.
  696. X
  697. X    PICTURE needs upgrading by providing one or two alternative features.
  698. X    One of these could be called MASK (though it could be an upgraded
  699. X    version of PICTURE), and the other could be called REGEXPR.  It would
  700. X    be very useful to be able to validate the input according to one of a
  701. X    number of MASK or REGEXPR controls, too.  The sort of thing I have in
  702. X    mind for MASK would be:
  703. X
  704. X    Mask    Meaning                                 REGEXPR
  705. X    A       alphabetic                              [a-zA-Z]
  706. X    U       upper-case alphabetic                   [A-Z]
  707. X    L       lower-case alphabetic                   [a-z]
  708. X    N       alphanumeric                            [a-zA-Z0-9]
  709. X    D       decimal digit                           [0-9]
  710. X    O       octal digit                             [0-7]
  711. X    X       hexadecimal digit                       [0-9a-fA-F]
  712. X    P       punctuation                             [^a-zA-Z0-9_] (approx)
  713. X    K       keyword character (N + '_')             [a-zA-Z0-9_]
  714. X    .       any character                           .
  715. X    \x      x                                       x
  716. X
  717. X    a       alphabetic or space                     [a-zA-Z ]
  718. X    u       upper-case alphabetic or space          [A-Z ]
  719. X    l       lower-case alphabetic or space          [a-z ]
  720. X    n       alphanumeric or space                   [a-zA-Z0-9 ]
  721. X    d       decimal digit or space                  [0-9 ]
  722. X    o       octal digit or space                    [0-7 ]
  723. X    x       hexadecimal digit or space              [0-9a-fA-F ]
  724. X    p       punctuation or space                    [^a-zA-Z0-9_] (approx)
  725. X    k       keyword character (n + '_') or space    [a-zA-Z0-9_ ]
  726. X
  727. X    Other classes could be added.  One possibility would be I/i for ISBN
  728. X    character, meaning [0-9X].
  729. X
  730. X    The REGEXPR string would be a full Unix regular expression, though
  731. X    which version would have to be decided.  The obvious one to support is
  732. X    the one provided by regexpr(3) in System V Release 4.  Anyway, the
  733. X    MASK attribute could be converted by a simple set of rules into a
  734. X    REGEXPR, so that the internal code need only handle REGEXPR's.
  735. X
  736. X    These could be used in a form as shown below:
  737. X
  738. X    ATTRIBUTES
  739. X    f001 = table01.uk_postcode, ..., UPSHIFT,
  740. X         MASK = ("UD DUU", "UDD DUU", "UUD DUU", "UUDD DUU", "UUDU DUU");
  741. X    f002 = table01.number_plate, ..., UPSHIFT,
  742. X         REGEXPR = ("[A-Z]?[0-9]\{1,3\}[A-Z]\{1,3\}",
  743. X                    "[A-Z]\{1,3\}[0-9]\{1,3\}[A-Z]?");
  744. X
  745. X    A few words of explanation are in order.  The set of masks are correct
  746. X    for British postcodes; these can take the forms "B1 7BU", "B12 9AJ",
  747. X    "IP2 3JB", "IP10 9WQ", "EC1A 7YG", and these are encoded appropriately
  748. X    in the mask values.  The regular expressions are correct for British
  749. X    civilian (non-military) non-diplomatic car number plates.  These can
  750. X    take the form of an optional single letter (denoting year of
  751. X    manufacture) followed by a 1 to 3 digits, followed by 1 to 3 letters,
  752. X    or it can be 1 to 3 letters followed by 1 to 3 digits and an optional
  753. X    single letter (also denoting year of manufacture).  The military
  754. X    numbers would use "[0-9][0-9][A-Z][A-Z][0-9][0-9]", and the diplomatic
  755. X    plates would use "[0-9][0-9][0-9]D[0-9][0-9][0-9]".  This covers most,
  756. X    if not all, valid British registration numbers.  Some could be matched
  757. X    by either of the patterns (J9K) and that is probably not a valid
  758. X    number, but J1 probably is valid, and 1J probably would be valid too.
  759. X
  760. X    The PICTURE facility limits the data that can be entered as it is being
  761. X    entered, character by character.  The MASK facility could do the same
  762. X    when a single MASK was specified.  If alternative MASKs were specified,
  763. X    it would still be possible to provide character by character
  764. X    validation, but there would be problems presenting the template if they
  765. X    had different literal characters embedded in them; the MASK could not
  766. X    then present the literal characters at the start of the input, but what
  767. X    is entered could still be validated against the alternative MASKs.  If
  768. X    a full REGEXPR with wildcarding was specified, or if multiple REGEXPRs
  769. X    were, the task of calculating whether the entered character is a valid
  770. X    prefix of the final string is probably non-computable; it would
  771. X    certainly be very hard.  Thus, MASK is an upward extension of PICTURE,
  772. X    but REGEXPR cannot provide.  All masks and regular expressions would
  773. X    completely ignore trailing blanks when matching.
  774. X
  775. X    I4GL-F04 was rated in class B because it should be fairly easy to
  776. X    implement and is certainly needed.
  777. X
  778. XI4GL-F05:
  779. X    Screens have limited space on them, and long character strings are a
  780. X    nuisance if they are normally short but can be long.  It would be
  781. X    useful if I4GL forms could have an attribute SCROLLING which would mean
  782. X    that if the user needed to enter more characters in the data than
  783. X    appeared on the screen, the field would scroll horizontally.  To move
  784. X    onto the next field, the TAB key, UP key or DOWN key would have to be
  785. X    pressed to move onto the next field.  The ultimate limit on the amount
  786. X    of data that could be typed into the field would be the length of the
  787. X    underlying field.  If the field was a formonly field, the length of the
  788. X    underlying type would have to be specified if SCROLLING was used (but,
  789. X    for backwards compatability, not if the SCROLLING attribute was not
  790. X    used.  The interaction between SCROLLING and WORDWRAP or WORDWRAP
  791. X    COMPRESS would need to be carefully considered.  If the field is
  792. X    WORDWRAPPED, then the obvious jump-quantum for the scroll is the size
  793. X    of the last element of the set of fields.  It may be simplest if, in a
  794. X    first release, SCROLLING and WORDWRAP cannot both be specified.  A
  795. X    subsequent release could add the extra functionality as required.
  796. X
  797. X    I4GL-F05 was rated in class C because it would be moderately difficult
  798. X    to implement but would be very valuable.
  799. X
  800. XI4GL-F06:
  801. X    One of the correspondents in CDI simply specified the requirement
  802. X    2-dimensional screen arrays with no further explanation.  See I4GL-F07
  803. X    for one possible explanation.  Otherwise, more information is needed.
  804. X
  805. X    I4GL-F06 was rated in class F because the requirements are not clear.
  806. X
  807. XI4GL-F07:
  808. X    If a screen array has, for example, 3 columns of fields, then I4GL
  809. X    assumes that they are to be accessed in row-major order (so it goes
  810. X    across the screen before it goes down).  It would frequently be
  811. X    preferable if they could be processed in column-major order (so the
  812. X    cursor would move down before going across).  This should probably be
  813. X    controlled by a definition appended to the screen record.
  814. X
  815. X    [f000  ]   [f000  ]  [f000  ]           1
  816. X    [f000  ]   [f000  ]  [f000  ]           2
  817. X    [f000  ]   [f000  ]  [f000  ]           3
  818. X    [f000  ]   [f000  ]  [f000  ]           4
  819. X
  820. X    f000 = table01.column02;
  821. X
  822. X    SCREEN RECORD s_array[12] MOVE BY COLUMN SCROLL BY COLUMN
  823. X                (table01.column02)
  824. X
  825. X    MOVE BY COLUMN means that the cursor will move in down before across;
  826. X    MOVE BY ROW is the default.  SCROLL BY COLUMN means that when the user
  827. X    tries to go beyond the last field, the entries in the middle column
  828. X    will be displayed in the same row in the first column, and the entries
  829. X    in the last column will appear in the middle column, and either a new
  830. X    column full of entries will be displayed or an empty column would be
  831. X    displayed, with the cursor at the top of the last column in either
  832. X    case.  SCROLL BY ROW (the default) would shuffle everything back on
  833. X    place in the order of the cursor movement.
  834. X
  835. X    The perverse will wonder what happens if the array looks like the one
  836. X    below and column major order is specified.  Row major order does not
  837. X    present any particular problem (though the rows have different numbers
  838. X    of fields in them).  If the array was not rectilinear, then maybe
  839. X    column major order should be disallowed.  I have numbered the fields in
  840. X    the order that I think they would be processed if column major order
  841. X    was specified (and allowed).
  842. X
  843. X                                        1 [f000  ]
  844. X    2 [f000  ] 6 [f000  ] 9 [f000  ]
  845. X               3 [f000  ]
  846. X    4 [f000  ]            7 [f000  ]
  847. X    5 [f000  ] 8 [f000  ]         10 [f000  ]
  848. X
  849. X    I4GL-F07 was rated in class C because it should be easy to implement
  850. X    and is quite desirable.
  851. X
  852. XI4GL-F08:
  853. X    Sometimes, some people should not be able to enter data in a particular
  854. X    field on a form whereas other users should be able to do so.  This can
  855. X    be controlled relatively easily by a test in the BEFORE FIELD and using
  856. X    the NEXT FIELD SAME DIRECTION (I4GL-F09) feature to skip the field.
  857. X    However, there are also occasions when certain users should simply not
  858. X    be allowed to see the field (except perhaps by the absence of any other
  859. X    information in the space on the form).  It should be possible to
  860. X    dynamically hide screen fields completely.  This feature is closely
  861. X    related to the the other dynamic form attributes requests (such as most
  862. X    of the DISPLAY ARRAY features).
  863. X
  864. X    I4GL-F08 was rated in class C because it would be moderately difficult
  865. X    to implement.
  866. X
  867. XI4GL-F09:
  868. X    NEXT FIELD NEXT always goes to the field after the current field, and
  869. X    NEXT FIELD PREVIOUS always goes to the field before the current field.
  870. X    It is difficult to write pop-up code (where NEXT FIELD must be called
  871. X    for the value to "take") such that if the cursor was moving backwards,
  872. X    NEXT FIELD PREVIOUS is used, and if the cursor was going forwards, NEXT
  873. X    FIELD NEXT is used, because the program has to keep track of which
  874. X    field the cursor was in previously (duplicating I4GL's efforts, too).
  875. X    An extra option NEXT FIELD SAME DIRECTION could be provided to make
  876. X    this much easier.
  877. X
  878. X    I4GL-F09 was rated in class B because it should be easy to implement
  879. X    and would be very useful.
  880. X
  881. XI4GL-F10:
  882. X    The INFIELD function can determine which field the cursor is currently
  883. X    in when it is called outside the scope of an INPUT or INPUT ARRAY
  884. X    statement.  I4GL should allow the programmer to specify "NEXT FIELD
  885. X    fieldname" outside the scope of an INPUT or INPUT ARRAY statement, and
  886. X    should allow the fieldname to be a string variable.  There should also
  887. X    be a direct CURRENT_FIELD() function which returns the name of the
  888. X    current field -- the INFIELD may have to be called many times to find
  889. X    the name of the correct field.  Assuming field names as strings is
  890. X    supported, INFIELD should accept a string as well as a plain field
  891. X    name.
  892. X
  893. X    I4GL-F10 was rated in class B because it would be very useful and
  894. X    should not be very hard to do.
  895. X
  896. XI4GL-F11:
  897. X    It would occasionally be useful to know the size of the current form.
  898. X
  899. X    I4GL-F11 was rated in class E because it is of debatable value.
  900. X
  901. XI4GL-F12:
  902. X    Assuming form variables are allowed, it should be possible to discover
  903. X    the name of the current form so that a  new form can be displayed in the
  904. X    current window and then the original form can be restored after the new one
  905. X    has been finished with.
  906. X
  907. X    I4GL-F12 was rated in class E because although it should be easy to
  908. X    implement but since windows are cheap and quick to open, the
  909. X    functionality is of debatable value.
  910. X
  911. XI4GL-F13:
  912. X    It would often be useful to get the size (declared dimension) of a
  913. X    named screen array, so that the code could display no more than the
  914. X    correct number of values to the array.
  915. X
  916. X    I4GL-F13 was rated in class A because it should be easy to implement
  917. X    and would be immediately useful.
  918. X
  919. XI4GL-F14:
  920. X    It would sometimes be useful to be able to obtain the names of the
  921. X    fields in a given screen record or screen array.  It would also be
  922. X    useful to be able to discover type and attribute information.  Some
  923. X    sort of interface to this information would probably be necessary to
  924. X    support dynamic attribute setting, anyway, but handling a variable
  925. X    length list of items presents some problems in current I4GL.
  926. X
  927. X    I4GL-F14 was rated in class E because it would be difficult to provide
  928. X    an appropriate return mechanism and because it is not immediately clear
  929. X    how useful it would be.
  930. X
  931. XI4GL-F15:
  932. X    I4GL currently supports two screen dump mechanisms, neither of which is
  933. X    totally satisfactory, and neither of which is properly documented.  The
  934. X    two mechanisms are very similar: one uses the environment variable
  935. X    DBSCREENOUT and puts a screen dump in the named file when the users
  936. X    presses control-P, the other uses DBSCREENDUMP and the same key stroke.
  937. X    If both variables are defined, both dumps are done.  There is a
  938. X    difference in the format of the two dumps; DBSCREENDUMP is likely to
  939. X    include control characters missing from DBSCREENOUT.  One of these two
  940. X    mechanisms is documented in that best-seller -- the QuickStep Reference
  941. X    Manual.
  942. X
  943. X    I4GL should seriously look at these two mechanisms, scrap one of them
  944. X    (probably) and document the other.
  945. X
  946. X    I4GL-F15 was rated in class A because it should be easy to do.
  947. X
  948. XI4GL-F16:
  949. X    It would occasionally be used to be able to distinguish between a blank
  950. X    entered in a field and a null field.  It would occasionally be useful
  951. X    to be able to distinguish between trailing blanks typed by the user and
  952. X    trailing blanks which are simply padding.
  953. X
  954. X    However, neither of these facilities can be changed without very major
  955. X    overhaul of both I4GL and the engines.
  956. X
  957. X    I4GL-F16 was rated in class F because it would be very difficult to do
  958. X    without breaking all sort of existing code.
  959. X
  960. XI4GL-F17:
  961. X    When a form is displayed, the display attributes of the fields in the
  962. X    form should be set.  At the moment, these attributes get set when a
  963. X    value is displayed to the field.  This makes CONSTRUCT look very messy,
  964. X    and doesn't help INPUT or DISPLAY fields either.  DISPLAY FORM should
  965. X    probably do an implicit display of a null value to every field on the
  966. X    form.  It is not clear whether there are any backwards compatability
  967. X    issues; if there are, then maybe the syntax should be extended as
  968. X    shown, with the default of WITHOUT NULL DISPLAY.
  969. X
  970. X        DISPLAY FORM f_form [ { WITH | WITHOUT } NULL DISPLAY ]
  971. X
  972. X    I4GL-F16 was rated in class C because it should not be difficult to do.
  973. X
  974. X----------------------------------------------------------------------
  975. X
  976. XWINDOWS
  977. X
  978. XI4GL-W01:
  979. X    It is possible to reduce a window with a form in it to two lines, one
  980. X    for the input field and one for the comment line, with the prompt and
  981. X    comment lines doubling up with one or other of the lines.  It would
  982. X    frequently be useful to be able suppress the comment line too, so that
  983. X    the window could use simply one line.  For consistency, the other lines
  984. X    should be suppressible too, by specifying
  985. X
  986. X        ATTRIBUTES (MENU LINE OFF, PROMPT LINE OFF, COMMENT LINE OFF)
  987. X
  988. X    It might also be useful to be able to specify that errors should be
  989. X    displayed in a window, but there are probably good reasons for not
  990. X    allowing ERROR LINE OFF, because even if error messages should not be
  991. X    displayed in the current window, they should be displayed to the
  992. X    screen.
  993. X
  994. X    I4GL-W01 was rated in class A because it should be easy to do.
  995. X
  996. XI4GL-W02:
  997. X    It would be useful to be able to determine the size of the current
  998. X    window.
  999. X
  1000. X    I4GL-W02 was rated in class B because it should be easy to do.
  1001. X
  1002. XI4GL-W03:
  1003. X    It would be useful to be able to determine the name of the current
  1004. X    window so that it can be restored subsequently by CURRENT WINDOW IS
  1005. X    w_variable.  This assumes, of course, that window variables are
  1006. X    supported.
  1007. X
  1008. X    I4GL-W03 was rated in class B because it should be easy to do and
  1009. X    would be useful.
  1010. X
  1011. XI4GL-W04:
  1012. X    It would be nice if boxes could be drawn properly.  It would be even
  1013. X    better if overlapping boxes were drawn with the correct characters --
  1014. X    at the moment, if you draw box B which sits over the top part of box A,
  1015. X    there is a small gap where the bottom corners of B remove the boundary
  1016. X    of box A.
  1017. X
  1018. X       +-----------------------+
  1019. X       |                       |
  1020. X       |  B                    |
  1021. X       +-----------------------+
  1022. X
  1023. X       |                       |
  1024. X       |  A                    |
  1025. X       +-----------------------+
  1026. X
  1027. X    The gap which has been shown as a whole line is actually about half a
  1028. X    line if box drawing characters are available.  On a Sun, you don't
  1029. X    necessarily get the nice box lines so you don't notice the effect.  It
  1030. X    means that you need to have the cross, left-tee, right-tee, up-tee and
  1031. X    down-tee characters available.  These can be defined in terminfo and
  1032. X    have been retrofitted to termcap (and could be added to the gb
  1033. X    capability which we have defined).
  1034. X
  1035. X    I4GL-W04 was rated in class C because it would improve the appearance
  1036. X    of I4GL windows, but it would not be particularly simple to do.
  1037. X
  1038. X----------------------------------------------------------------------
  1039. X
  1040. XINPUT
  1041. X
  1042. XI4GL-I01:
  1043. X    It would often be helpful to be able to change the display attributes
  1044. X    of a screen field dynamically (see I4GL-I02, I4GL-F08, I4GL-F14, etc).
  1045. X    The existing OPTIONS DISPLAY ATTRIBUTES facility is not sufficiently
  1046. X    general to satisfy this requirement because if a particular field
  1047. X    required a particular attribute to be set (which was different from
  1048. X    that of other fields also being displayed), then OPTIONS DISPLAY
  1049. X    ATTRIBUTES would have to be called both before and after a value was
  1050. X    displayed to the field.  The proposed facility would allow the display
  1051. X    attribute for the field to be set permanently.
  1052. X
  1053. X    Of course, the mechanism should allow the field name to be specified as
  1054. X    a string, and the necessary attributes and attribute values could also
  1055. X    be variables.
  1056. X
  1057. X    I4GL-I01 was rated in class B because it would be very useful.
  1058. X
  1059. XI4GL-I02:
  1060. X    It would sometimes be helpful to be able to change the status of some
  1061. X    screen fields dynamically (see I4GL-F08, I4GL-F14).  I4GL should allow
  1062. SHAR_EOF
  1063. echo "End of part 2"
  1064. echo "File i4glmods is continued in part 3"
  1065. echo "3" > s2_seq_.tmp
  1066. exit 0
  1067.