home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / GEN3D2.ZIP / GENSCRN.PRG < prev    next >
Text File  |  1995-02-01  |  295KB  |  9,224 lines

  1. *:*****************************************************************************
  2. *:
  3. *: Procedure file: C:\FOXPROW\GENSCRN.PRG
  4. *:         System: GenScrn
  5. *:         Author: Microsoft Corp.
  6. *:      Copyright (c) 1990 - 1993 Microsoft Corp.
  7. *:  Last modified: 1/4/93 at 19:33:06
  8. *:
  9. *:      Documented              FoxDoc version 3.00a
  10. *:*****************************************************************************
  11. *
  12. * GENSCRN - Screen Code Generator.
  13. *
  14. * Copyright (c) 1990 - 1993 Microsoft Corp.
  15. * One Microsoft Way
  16. * Redmond, WA 98502
  17. *
  18. * Description:
  19. * This program generates code for objects designed and built with
  20. * FoxPro screen builder.
  21. *
  22. * Notes:
  23. * In this program, for clarity/readability reasons, we use variable
  24. * names that are longer than 10 characters.  Note, however, that only
  25. * the first 10 characters are significant.
  26. *
  27.  
  28. ******************************************************************************
  29. *                                                                            *
  30. *  Modified for use with GEN3D                                               *
  31. *  3d modification for GENSCRN.PRG                                           *
  32. *  @COPYRIGHT 1995, Chris Newland                                            *
  33. *                                                                            *
  34. *  Modifications have been made for use with GEN3D.PRG.  If that program     *
  35. *  exists, please refer to the comments located at the header of that        *
  36. *                                                                            *
  37. *  I welcome any comments or statements regarding this modification.  I can  *
  38. *  be reached on COMPUSERVE at 75242,430 or on AOL at                        *
  39. *  Please forward all written inquiries to:                                  *
  40. *  Chris Newland                                                             *
  41. *  P.O. Box 1411                                                             *
  42. *  Long Island City, N.Y.  1101                                              *
  43. ******************************************************************************
  44.  
  45. PARAMETER m.projdbf, m.recno
  46. PRIVATE ALL
  47.  
  48. IF SET("TALK") = "ON"
  49.    SET TALK OFF
  50.    m.talkset = "ON"
  51. ELSE
  52.    m.talkset = "OFF"
  53. ENDIF
  54.  
  55. m.escape = SET("ESCAPE")
  56. ON ESCAPE
  57. SET ESCAPE OFF
  58. m.trbetween = SET("TRBET")
  59. SET TRBET OFF
  60. m.comp = SET("COMPATIBLE")
  61. SET COMPATIBLE FOXPLUS
  62. mdevice = SET("DEVICE")
  63. SET DEVICE TO SCREEN
  64.  
  65. *| >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  66. *| CN Sun  01-29-9502:56:32 Added build for my gen3d procs
  67. STORE .F. TO ll_DO_3D
  68. IF FILE("GEN3D.FXP")
  69.   SET PROCEDURE TO GEN3D
  70.   STORE .T. TO ll_DO_3D
  71. ELSE
  72.   IF FILE(ALLTRIM(SYS(2004))+"GEN3D.FXP")
  73.     SET PROCEDURE TO (ALLTRIM(SYS(2004))+"GEN3D.FXP")
  74.     STORE .T. TO ll_DO_3D
  75.   ENDIF
  76. ENDIF
  77. *| End of Mod
  78. *| <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  79.  
  80. *
  81. * Declare Global Constants
  82. *
  83. #DEFINE c_otscreen         1
  84. #DEFINE c_otworkarea       2
  85. #DEFINE c_otindex          3
  86. #DEFINE c_otrel               4
  87. #DEFINE c_ottext           5
  88. #DEFINE c_otline           6
  89. #DEFINE c_otbox            7
  90. #DEFINE c_otlist          11
  91. #DEFINE c_ottxtbut        12
  92. #DEFINE c_otradbut        13
  93. #DEFINE c_otchkbox        14
  94. #DEFINE c_otfield         15
  95. #DEFINE c_otpopup         16
  96. #DEFINE c_otpicture       17
  97. #DEFINE c_otinvbut        20
  98. #DEFINE c_otspinner       22
  99.  
  100. #DEFINE c_authorlen       45
  101. #DEFINE c_complen         45
  102. #DEFINE c_addrlen         45
  103. #DEFINE c_citylen         20
  104. #DEFINE c_statlen          5
  105. #DEFINE c_ziplen          10
  106. #DEFINE c_countrylen      40
  107.  
  108. #DEFINE c_sgsay            0
  109. #DEFINE c_sgget            1
  110. #DEFINE c_sgedit           2
  111. #DEFINE c_sgfrom           3
  112. #DEFINE c_sgbox            4
  113. #DEFINE c_sgboxd           5
  114. #DEFINE c_sgboxp           6
  115. #DEFINE c_sgboxc           7
  116.  
  117. #DEFINE c_dos     "DOS"
  118. #DEFINE c_windows "WINDOWS"
  119. #DEFINE c_mac     "MAC"
  120. #DEFINE c_unix    "UNIX"
  121.  
  122. * Determines whether SHOW snippets are checked for suspicious SHOW GETS statements
  123. #DEFINE c_checkshow        1
  124.  
  125. #DEFINE c_maxwinds        25
  126. #DEFINE c_maxpops         25
  127. #DEFINE c_maxscreens       5
  128. #DEFINE c_maxplatforms     4
  129. #DEFINE c_20scxflds          57
  130. #DEFINE c_scxflds         79
  131. #DEFINE c_pjxflds         31
  132. #DEFINE c_pjx20flds       33
  133.  
  134. #DEFINE c_esc            CHR(27)
  135. #DEFINE c_null            CHR(0)
  136. #DEFINE c_cret            CHR(13)
  137. #DEFINE c_lf            CHR(10)
  138. #DEFINE c_under            "_"
  139. #DEFINE c_single        "┌─┐│┘─└│"
  140. #DEFINE c_double        "╔═╗║╝═╚║"
  141. #DEFINE c_panel            "████████"
  142. #DEFINE c_fromone        1
  143. #DEFINE c_untilend        0
  144.  
  145. #DEFINE c_error_1        "Minor"
  146. #DEFINE c_error_2        "Serious"
  147. #DEFINE c_error_3        "Fatal"
  148.  
  149. #DEFINE c_aliaslen   10   && maximum alias length
  150.  
  151. #DEFINE c_premode            0
  152. #DEFINE c_postmode            1
  153.  
  154. #DEFINE c_userprecode        "*# USERPRECOMMAND"
  155. #DEFINE c_userpostcode        "*# USERPOSTCOMMAND"
  156.  
  157. IF _MAC
  158.    m.g_dlgface = "Geneva"
  159.    m.g_dlgsize = 10.000
  160.    m.g_dlgstyle = ""
  161. ELSE
  162.    m.g_dlgface = "MS Sans Serif"
  163.    m.g_dlgsize = 8.000
  164.    m.g_dlgstyle = "B"
  165. ENDIF
  166.  
  167. #DEFINE c_pathsep  "\"
  168.  
  169. #DEFINE c_genexpr    0
  170. #DEFINE c_gencode    1
  171. #DEFINE c_genboth    -1
  172.  
  173. #DEFINE c_therm1      5
  174. #DEFINE c_therm2     15
  175. #DEFINE c_therm3     35
  176. #DEFINE c_therm4     60
  177. #DEFINE c_therm5     65
  178. #DEFINE c_therm6     70
  179. #DEFINE c_therm7     95
  180.  
  181. #DEFINE c_all 1
  182. m.g_picext = "PCT"   && Mac picture
  183. m.g_bmpext = "BMP"   && Windows bitmap
  184. m.g_icnext = "ICN"   && Mac icon
  185. m.g_icoext = "ICO"   && Windows icon
  186.  
  187. m.g_genparams = PARAMETERS()
  188. *
  189. * Declare Variables
  190. *
  191. STORE "" TO m.cursor, m.consol, m.bell, m.exact, ;
  192.    m.safety, m.fixed, m.print, m.delimiters, m.unique, mudfparms, ;
  193.    m.fields, mfieldsto, m.mdecpoint, m.origpretext, m.mcollate, m.mmacdesk
  194. STORE 0 TO m.deci, m.memowidth
  195.  
  196. m.g_closefiles = .F.           && Generate code to close files?
  197. m.g_current    = ""            && current DBF
  198. m.g_defasch1   = 0               && Default color scheme 1
  199. m.g_defasch2   = 0               && Default color scheme 2
  200. m.g_defwin     = .F.           && Generate code to define windows?
  201. m.g_errlog     = ""               && Path + name of .ERR file
  202. m.g_homedir    = ""               && Application Home Directory
  203. m.g_idxfile    = 'idxfile.idx' && Index file
  204. m.g_itse       = c_null           && Designating character from #ITSEXPRESSION
  205. m.g_lastwindow = ""            && Name of last window defined
  206. m.g_keyno      = 0
  207. m.g_havehand = .F.
  208. m.g_redefi     = .F.           && Don't redefine windows
  209. m.g_screen     = 0             && Screen currently being generated.  Also used in error messages.
  210. m.g_nscreens   = 0             && Number of screens
  211. m.g_nwindows   = 0             && Number of unique windows in this platform
  212. m.g_multreads  = .F.           && Multiple reads?
  213. m.g_openfiles  = .F.           && Generate code to open files?
  214. m.g_orghandle  = -1            && File handle for ctrl file
  215. m.g_outfile    = ""            && Output file name
  216. m.g_projalias  = ""            && Project database alias
  217. m.g_projpath   = ""
  218. m.g_rddir      = .F.           && Is there a #READCLAUSES directive?
  219. m.g_windclauses= ""            && #WCLAUSES parameters for DEFINE WINDOW
  220. m.g_rddirno    = 0             && Number of 1st screen with #READ directive
  221. m.g_readcycle  = .F.           && READ CYCLE?
  222. m.g_readlock   = .F.           && READ LOCK/NOLOCK?
  223. m.g_readmodal  = .F.           && READ MODAL?
  224. m.g_readborder = .F.           && READ BORDER?
  225. m.g_relwin     = .F.           && Generate code to release windows?
  226. m.g_moddesktop = .F.
  227. m.g_snippcnt   = 0             && Count of snippets
  228. m.g_somepops   = .F.           && Any Generated popups?
  229. m.g_status     = 0
  230. m.g_thermwidth = 0             && Thermometer width
  231. m.g_tmpfile    = SYS(3)+".tmp" && Temporary file
  232. m.g_tmphandle  = -1            && File handle for tmp file
  233. m.g_windows    = .F.           && Any windows in screen files?
  234. m.g_withlist   = ""
  235. m.g_workarea   = 0
  236. m.g_genvers       = ""            && version we are generating for
  237. m.g_thisvers   = ""            && version we are running under now
  238. m.g_graphic    = .F.
  239. m.g_isfirstproc= .T.           && is this the first procedure emitted?
  240. m.g_procsmatch = .F.           && are cleanup snippets for all platforms identical
  241. m.g_noread     = .F.           && omit the read statement?
  242. m.g_noreadplain= .F.           && omit the read statement and the SET TALK TO.. statements?
  243. m.g_dualoutput = .F.           && generating for Mac on Windows (& etc.) ?
  244.  
  245. m.g_boxstrg = ['─','─','│','│','┌','┐','└','┘','─','─','│','│','┌','┐','└','┘']
  246.  
  247. m.g_validtype  = ""
  248. m.g_validname  = ""
  249. m.g_whentype   = ""
  250. m.g_whenname   = ""
  251. m.g_actitype   = ""
  252. m.g_actiname   = ""
  253. m.g_deattype   = ""
  254. m.g_deatname   = ""
  255. m.g_showtype   = ""
  256. m.g_showname   = ""
  257. m.g_showexpr   = ""
  258.  
  259. m.g_sect1start = 0
  260. m.g_sect2start = 0
  261.  
  262. m.g_devauthor  = PADR("Author's Name",c_authorlen," ")
  263. m.g_devcompany = PADR("Company Name",c_complen, " ")
  264. m.g_devaddress = PADR("Address",c_addrlen," ")
  265. m.g_devcity    = PADR("City",c_citylen," ")
  266. m.g_devstate   = "  "
  267. m.g_devzip     = PADR("Zip",c_ziplen," ")
  268. m.g_devctry    = PADR("Country",c_countrylen, " ")
  269.  
  270. m.g_allplatforms = .T.            && generate for all platforms in the SCX?
  271. m.g_numplatforms = 1              && number of platforms we are generating for
  272. m.g_parameter    = ""             && the parameter statement for this SPR
  273. m.g_areacount    = 1              && index into g_areas to count workareas we use
  274. m.g_dblampersand = CHR(38) + CHR(38)   && used in some tight loops.  Concatenate just once here.
  275.  
  276. DO CASE
  277. CASE AT(c_windows, UPPER(VERSION())) <> 0
  278.    m.g_thisvers = c_windows
  279.    m.g_graphic  = .T.
  280. CASE AT(c_mac, UPPER(VERSION())) <> 0
  281.    m.g_thisvers = c_mac
  282.    m.g_graphic  = .T.
  283. CASE AT(c_unix, UPPER(VERSION())) <> 0
  284.    m.g_thisvers = c_unix
  285.    m.g_graphic  = .F.
  286. CASE AT("FOXPRO", UPPER(VERSION())) <> 0
  287.    m.g_thisvers = c_dos
  288.    m.g_graphic  = .F.
  289. OTHERWISE
  290.    DO errorhandler WITH "Unknown FoxPro platform",LINENO(),c_error_3
  291. ENDCASE
  292.  
  293. STORE "" TO m.g_corn1, m.g_corn2, m.g_corn3, m.g_corn4, m.g_corn5, ;
  294.    m.g_corn6, m.g_verti2
  295. STORE "*" TO  m.g_horiz, m.g_verti1
  296.  
  297. * This array stores the names of the DBFs in the environment for this platform
  298. DIMENSION g_dbfs[1]
  299. g_dbfs = ""
  300.  
  301. * If you add arrays that are based on C_MAXSCREENS, remember to check PrepScreens().
  302. * You'll probably need to add the array name there so that if the number of screens
  303. * exceeds C_MAXSCREENS, your array gets expanded too.
  304.  
  305. *    generated popup names associated with scollable lists.
  306. *
  307. *    g_popups[*,1] - screen basename
  308. *    g_popups[*,2] - record number
  309. *    g_popups[*,3] - generated popup name
  310. *
  311. DIMENSION g_popups[C_MAXPOPS,3]
  312. g_popups = ""
  313.  
  314. *     screen file name array definition
  315. *
  316. *     g_screens[*,1] - screen fully qualified name
  317. *     g_screens[*,2] - window name if any
  318. *     g_screens[*,3] - recno in proj dbf
  319. *    g_screens[*,4] - initially opened?
  320. *    g_screens[*,5] - alias
  321. *    g_screens[*,6] - 2.0 screen file?
  322. *    g_screens[*,7] - Platform to generate from
  323. *
  324. DIMENSION g_screens[C_MAXSCREENS,7]
  325. g_screens = ""
  326.  
  327. * Array to store window stack.
  328. * g_wndows[*,1]  - Window name
  329. * g_wndows[*,2]  - Window sequence
  330. DIMENSION g_wndows[C_MAXWINDS,2]
  331. g_wndows = ""
  332.  
  333. * Store the substitution string for window names
  334. DIMENSION g_wnames[C_MAXSCREENS, C_MAXPLATFORMS]
  335. g_wnames = ""
  336.  
  337. * g_platforms holds a list of platforms in common among all screens
  338. DIMENSION g_platforms[C_MAXSCREENS]
  339. g_platforms = ""
  340.  
  341. * g_platprocs is a parallel array to g_platforms.  It holds the name
  342. * of the procedure to contain the setup snippet and all the @SAYs
  343. * and @GETs for the corresponding platform.
  344. DIMENSION g_platproc[C_MAXSCREENS]
  345. g_platproc = ""
  346.  
  347. * g_areas holds a list of areas we opened files in during this gen and that
  348. * we need to close on exit.
  349. DIMENSION g_areas[256]
  350. g_areas = 0
  351.  
  352. * g_firstproc holds the line number of the first PROCEDURE or FUNCTION in
  353. * the cleanup snippet of each screen.
  354. DIMENSION g_firstproc[C_MAXSCREENS]
  355. g_firstproc = 0
  356.  
  357. DIMENSION g_platlist[C_MAXPLATFORMS]
  358. g_platlist[1] = c_dos
  359. g_platlist[2] = c_windows
  360. g_platlist[3] = c_mac
  361. g_platlist[4] = c_unix
  362.  
  363. DIMENSION g_procs[1,C_MAXPLATFORMS+3]
  364. * First column is a procedure name
  365. * Second through n-th column is the line number in the cleanup snippet where
  366. *    a procedure with this name starts.
  367. * C_MAXPLATFORMS+2 column is a 1 if this procedure has been emitted.
  368. * C_MAXPLATFORMS+3 column holds the parameter statement, if any.
  369. * One row for each unique procedure name found in the cleanup snippet for any platform.
  370. g_procs = -1
  371. g_procs[1,1] = ""
  372. g_procs[1,C_MAXPLATFORMS+3] = ""
  373. g_procnames = 0   && the number we've found so far
  374.  
  375. **
  376. ** Main program
  377. **
  378.  
  379. m.onerror = ON("ERROR")
  380. ON ERROR DO errorhandler WITH MESSAGE(), LINENO(), c_error_3
  381.  
  382. IF m.g_genparams < 2
  383.    DO errorhandler WITH "Invalid number of parameters passed to"+;
  384.       " the generator",LINENO(),c_error_3
  385.    RETURN m.g_status
  386. ENDIF
  387.  
  388. DO setall
  389.  
  390. IF openprojdbf(m.projdbf, m.recno) AND prepscreens(m.g_thisvers) AND prepplatform()
  391.    DO BUILD
  392. ENDIF
  393.  
  394. DO cleanup
  395.  
  396. *| >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  397. *| CN Sun  01-29-9502:56:32 Added build for my gen3d procs
  398. IF ll_DO_3D
  399.   SET PROCEDURE TO
  400. ENDIF
  401. *| End of Mod
  402. *| <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  403.  
  404.  
  405. RETURN m.g_status
  406.  
  407. **
  408. ** Code Responsible for Genscrn's environment setting.
  409. **
  410.  
  411. *!*****************************************************************************
  412. *!
  413. *!      Procedure: SETALL
  414. *!
  415. *!      Called by: GENSCRN.PRG
  416. *!
  417. *!*****************************************************************************
  418. PROCEDURE setall
  419. *)
  420. *) SETALL - Create program's environment.
  421. *)
  422. *) Description:
  423. *) Save the user's environment that is being modified by the GENSCRN,
  424. *) then issue various SET commands.
  425. *)
  426. CLEAR PROGRAM
  427. CLEAR GETS
  428.  
  429. m.g_workarea = SELECT()
  430. m.delimiters = SET('TEXTMERGE',1)
  431. SET TEXTMERGE DELIMITERS TO
  432. SET TEXTMERGE NOSHOW
  433. mudfparms = SET('UDFPARMS')
  434. SET UDFPARMS TO VALUE
  435.  
  436. m.mfieldsto = SET("FIELDS",1)
  437. m.fields = SET("FIELDS")
  438. SET FIELDS TO
  439. SET FIELDS OFF
  440. m.memowidth = SET("MEMOWIDTH")
  441. SET MEMOWIDTH TO 256
  442. m.cursor = SET("CURSOR")
  443. SET CURSOR OFF
  444. m.consol = SET("CONSOLE")
  445. SET CONSOLE OFF
  446. m.bell = SET("BELL")
  447. SET BELL OFF
  448. m.exact = SET("EXACT")
  449. SET EXACT ON
  450. m.safety = SET("SAFETY")
  451. m.deci = SET("DECIMALS")
  452. SET DECIMALS TO 0
  453. m.mdecpoint = SET("POINT")
  454. SET POINT TO "."
  455. m.fixed = SET("FIXED")
  456. SET FIXED ON
  457. m.print = SET("PRINT")
  458. SET PRINT OFF
  459. m.unique = SET("UNIQUE")
  460. SET UNIQUE OFF
  461. m.mcollate = SET("COLLATE")
  462. SET COLLATE TO "machine"
  463. #if "MAC" $ UPPER(VERSION(1))
  464.    IF _MAC
  465.       m.mmacdesk = SET("MACDESKTOP")
  466.       SET MACDESKTOP ON
  467.     ENDIF
  468. #endif
  469. m.origpretext = _PRETEXT
  470. _PRETEXT = ""
  471. RETURN
  472.  
  473. *!*****************************************************************************
  474. *!
  475. *!      Procedure: CLEANUP
  476. *!
  477. *!      Called by: GENSCRN.PRG
  478. *!               : ERRORHANDLER       (procedure in GENSCRN.PRG)
  479. *!               : ESCHANDLER         (procedure in GENSCRN.PRG)
  480. *!
  481. *!          Calls: CLEANSCRN          (procedure in GENSCRN.PRG)
  482. *!               : CLEARAREAS         (procedure in GENSCRN.PRG)
  483. *!
  484. *!*****************************************************************************
  485. PROCEDURE cleanup
  486. *)
  487. *) CLEANUP - Restore environment to pre-execution state.
  488. *)
  489. *) Description:
  490. *) Put SET command settings back the way we found them.
  491. *)
  492. PRIVATE m.i, m.delilen, m.ldelimi, m.rdelimi
  493. IF EMPTY(m.g_projalias)
  494.    RETURN
  495. ENDIF
  496. SELECT (m.g_projalias)
  497. USE
  498. DO cleanscrn
  499. DO clearareas  && clear the workareas we opened during this run
  500. SELECT (m.g_workarea)
  501.  
  502. DELETE FILE (m.g_tmpfile)
  503. DELETE FILE (m.g_idxfile)
  504.  
  505. m.delilen = LEN(m.delimiters)
  506. m.ldelimi = SUBSTR(m.delimiters,1,;
  507.    IIF(MOD(m.delilen,2)=0,m.delilen/2,CEILING(m.delilen/2)))
  508. m.rdelimi = SUBSTR(m.delimiters,;
  509.    IIF(MOD(m.delilen,2)=0,m.delilen/2+1,CEILING(m.delilen/2)+1))
  510. SET TEXTMERGE DELIMITERS TO m.ldelimi, m.rdelimi
  511.  
  512. SET FIELDS TO &mfieldsto
  513. IF m.fields = "ON"
  514.    SET FIELDS ON
  515. ELSE
  516.    SET FIELDS OFF
  517. ENDIF
  518. IF m.cursor = "ON"
  519.    SET CURSOR ON
  520. ELSE
  521.    SET CURSOR OFF
  522. ENDIF
  523. IF m.consol = "ON"
  524.    SET CONSOLE ON
  525. ELSE
  526.    SET CONSOLE OFF
  527. ENDIF
  528. IF m.escape = "ON"
  529.    SET ESCAPE ON
  530. ELSE
  531.    SET ESCAPE OFF
  532. ENDIF
  533. IF m.bell = "ON"
  534.    SET BELL ON
  535. ELSE
  536.    SET BELL OFF
  537. ENDIF
  538. IF m.exact = "ON"
  539.    SET EXACT ON
  540. ELSE
  541.    SET EXACT OFF
  542. ENDIF
  543. IF m.safety = "ON"
  544.    SET SAFETY ON
  545. ELSE
  546.    SET SAFETY OFF
  547. ENDIF
  548. IF m.comp = "ON"
  549.    SET COMPATIBLE ON
  550. ENDIF
  551. IF m.print = "ON"
  552.    SET PRINT ON
  553. ENDIF
  554. SET DECIMALS TO m.deci
  555. SET MEMOWIDTH TO m.memowidth
  556. SET DEVICE TO &mdevice
  557. SET UDFPARMS TO &mudfparms
  558. SET POINT TO "&mdecpoint"
  559. SET COLLATE TO "&mcollate"
  560. #if "MAC" $ UPPER(VERSION(1))
  561.    IF _MAC
  562.       SET MACDESKTOP &mmacdesk
  563.     ENDIF
  564. #endif
  565. IF m.fixed = "OFF"
  566.    SET FIXED OFF
  567. ENDIF
  568. IF m.trbetween = "ON"
  569.    SET TRBET ON
  570. ENDIF
  571. IF m.talkset = "ON"
  572.    SET TALK ON
  573. ENDIF
  574. IF m.unique = "ON"
  575.    SET UNIQUE ON
  576. ENDIF
  577. SET MESSAGE TO
  578. _PRETEXT = m.origpretext
  579. * Leave this array if dbglevel is defined.  Used for profiling.
  580. * IF TYPE("dbglevel") = "U"
  581. *   RELEASE ticktock
  582. * ENDIF
  583.  
  584. ON ERROR &onerror
  585. RETURN
  586.  
  587. *!*****************************************************************************
  588. *!
  589. *!      Procedure: CLEANSCRN
  590. *!
  591. *!      Called by: CLEANUP            (procedure in GENSCRN.PRG)
  592. *!
  593. *!*****************************************************************************
  594. PROCEDURE cleanscrn
  595. *)
  596. *) CLEANSCRN - Clean up after each screen set generation, once per platform
  597. *)
  598. PRIVATE m.i
  599. FOR m.i = 1 TO m.g_nscreens
  600.    m.g_screen = i
  601.    IF NOT EMPTY(g_screens[m.i,4])
  602.       LOOP
  603.    ENDIF
  604.    IF USED(g_screens[m.i,5])
  605.       SELECT (g_screens[m.i,5])
  606.       USE
  607.    ENDIF
  608. ENDFOR
  609. m.g_screen = 0
  610. RETURN
  611.  
  612. *!*****************************************************************************
  613. *!
  614. *!      Procedure: BUILDENABLE
  615. *!
  616. *!      Called by: BUILD              (procedure in GENSCRN.PRG)
  617. *!
  618. *!          Calls: PREPFILE           (procedure in GENSCRN.PRG)
  619. *!               : ESCHANDLER         (procedure in GENSCRN.PRG)
  620. *!
  621. *!*****************************************************************************
  622. PROCEDURE buildenable
  623. *)
  624. *> BUILDENABLE - Enable code generation.
  625. *)
  626. *) Description:
  627. *) Call prepfile to open output file(s).
  628. *) If error(s) encountered in prepfile then exit, otherwise
  629. *) SET TEXTMERGE ON
  630. *)
  631. *) Returns: .T. on success; .F. on failure
  632. *)
  633. DO prepfile WITH m.g_outfile, m.g_orghandle
  634. DO prepfile WITH m.g_tmpfile, m.g_tmphandle
  635.  
  636. SET TEXTMERGE ON
  637. ON ESCAPE DO eschandler
  638. SET ESCAPE ON
  639. RETURN
  640.  
  641. *!*****************************************************************************
  642. *!
  643. *!      Procedure: BUILDDISABLE
  644. *!
  645. *!      Called by: BUILD              (procedure in GENSCRN.PRG)
  646. *!               : ESCHANDLER         (procedure in GENSCRN.PRG)
  647. *!
  648. *!          Calls: CLOSEFILE          (procedure in GENSCRN.PRG)
  649. *!
  650. *!*****************************************************************************
  651. PROCEDURE builddisable
  652. *)
  653. *) BUILDDISABLE - Disable code generation.
  654. *)
  655. *) Description:
  656. *) Issue the command SET TEXTMERGE OFF.
  657. *) Close the generated output file.
  658. *) Close the temporary file.
  659. *) If anything goes wrong display appropriate message to the user.
  660. *)
  661. SET ESCAPE OFF
  662. ON ESCAPE
  663. SET TEXTMERGE OFF
  664. IF m.g_havehand
  665.    DO closefile WITH m.g_orghandle
  666.    DO closefile WITH m.g_tmphandle
  667. ENDIF
  668. RETURN
  669.  
  670. *!*****************************************************************************
  671. *!
  672. *!      Procedure: PREPPARAMS
  673. *!
  674. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  675. *!
  676. *!          Calls: CHECKPARAM()       (function  in GENSCRN.PRG)
  677. *!
  678. *!*****************************************************************************
  679. PROCEDURE prepparams
  680. *)
  681. *) PREPPARAMS - Read through each of the platforms on screen 1
  682. *)              and ensure that any parameter statements in #SECTION 1
  683. *)              are identical.
  684. *)
  685. PRIVATE m.i, m.j, m.dbalias, m.thisparam
  686. m.g_screen = 1
  687. m.dbalias = g_screens[m.g_screen,5]
  688. SELECT (m.dbalias)
  689. DO CASE
  690. CASE g_screens[m.g_screen,6] OR !multiplat()
  691.    * DOS 2.0 screen or just one 2.5 platform being generated
  692.    GO TOP
  693.    RETURN checkparam(m.g_screen)
  694.  
  695. OTHERWISE
  696.    FOR m.j = 1 TO c_maxplatforms
  697.       LOCATE FOR ALLTRIM(UPPER(platform)) = g_platlist[m.j] AND objtype = c_otscreen
  698.       DO CASE
  699.       CASE !FOUND() OR EMPTY(setupcode)
  700.          LOOP
  701.       CASE !checkparam(m.g_screen)
  702.          RETURN .F.
  703.       ENDCASE
  704.    ENDFOR
  705. ENDCASE
  706. m.g_screen = 0
  707. RETURN .T.
  708.  
  709. *!*****************************************************************************
  710. *!
  711. *!       Function: CLEANPARAM
  712. *!
  713. *!      Called by: CHECKPARAM()       (function  in GENSCRN.PRG)
  714. *!               : UPDPROCARRAY       (procedure in GENSCRN.PRG)
  715. *!
  716. *!*****************************************************************************
  717. FUNCTION cleanparam
  718. *)
  719. *) CLEANPARAM - Clean up a parameter string so that it may be compared with another one.
  720. *)              This function replaces tabs with spaces, capitalizes the string, merges
  721. *)              forces single spacing, and strips out CR/LF characters.
  722. *)
  723. PARAMETER m.p, m.cp
  724. m.cp = UPPER(ALLTRIM(CHRTRAN(m.p,";"+CHR(13)+CHR(10),"")))   && drop CR/LF and continuation chars
  725. m.cp = CHRTRAN(m.cp,CHR(9),' ')   && tabs to spaces
  726. DO WHILE AT('  ',m.cp) > 0         && reduce multiple spaces to a single space
  727.    m.cp = STRTRAN(m.cp,'  ',' ')
  728. ENDDO
  729. DO WHILE AT(', ',m.cp) > 0         && drop spaces after commas
  730.    m.cp = STRTRAN(m.cp,', ',',')
  731. ENDDO
  732. RETURN m.cp
  733.  
  734. *!*****************************************************************************
  735. *!
  736. *!       Function: CHECKPARAM
  737. *!
  738. *!      Called by: PREPPARAMS         (procedure in GENSCRN.PRG)
  739. *!
  740. *!          Calls: GETPARAM()         (function  in GENSCRN.PRG)
  741. *!               : CLEANPARAM()       (function  in GENSCRN.PRG)
  742. *!               : ERRORHANDLER       (procedure in GENSCRN.PRG)
  743. *!
  744. *!*****************************************************************************
  745. FUNCTION checkparam
  746. *)
  747. *) CHECKPARAM - See if this parameter statement matches others we have found. Generate
  748. *)               an error message if it doesn't.  g_parameter is empty if we haven't
  749. *)               seen any parameter statements yet, or it contains the variables in the
  750. *)               parameter statement (but not the PARAMETERS keyword) if we have seen one
  751. *)               before.
  752. *)
  753. PARAMETER m.i
  754. PRIVATE m.thisparam
  755. m.thisparam = getparam("setupcode")  && get parameter from setup snippet at current record position
  756.  
  757. IF !EMPTY(m.thisparam)
  758.    IF !EMPTY(m.g_parameter) AND !(cleanparam(m.thisparam) == cleanparam(m.g_parameter))
  759.       DO errorhandler WITH "DOS and Windows setup code has different parameters", ;
  760.          LINENO(), c_error_3
  761.       RETURN .F.
  762.    ELSE
  763.       g_parameter = m.thisparam
  764.    ENDIF
  765. ENDIF
  766. RETURN .T.
  767.  
  768. *!*****************************************************************************
  769. *!
  770. *!      Procedure: PREPPLATFORM
  771. *!
  772. *!      Called by: GENSCRN.PRG
  773. *!
  774. *!*****************************************************************************
  775. PROCEDURE prepplatform
  776. *)
  777. *) PREPPLATFORM - Create an array of platform names in the screen set.  Make sure that
  778. *)                there is at least one common platform across all SCXs in the screen set.
  779. *)                g_platforms comes out of this procedure containing the intersection of
  780. *)                the set of platforms in each screen.  If there are no common platforms
  781. *)                across all screens, it will be empty.
  782. *)
  783. PRIVATE m.i, m.j, m.firstscrn, m.p_cur, m.tempplat, m.numtodel, m.in_area, ;
  784.    m.rcount
  785. IF m.g_nscreens <= 0
  786.    RETURN .F.
  787. ENDIF
  788.  
  789. DIMENSION t_platforms[ALEN(g_platforms)]
  790. m.in_area = SELECT()
  791. IF g_screens[1,6]         && First screen is a DOS 2.0 screen
  792.    g_platforms = ""
  793.    g_platforms[1] = "DOS"
  794. ELSE
  795.    IF _DOS
  796.       * Avoid selecting into an array to conserve memory
  797.       SELECT DISTINCT platform FROM (g_screens[1,1]) ;
  798.           WHERE IIF(INLIST(UPPER(platform), c_dos, ;
  799.             c_windows, c_mac, c_unix), .T., .F.) ;
  800.           INTO CURSOR curstemp ;
  801.          ORDER BY platform
  802.       m.rcount = _TALLY
  803.       SELECT curstemp
  804.       DIMENSION g_platforms[m.rcount]
  805.       GOTO TOP
  806.       FOR m.i = 1 TO m.rcount
  807.          g_platforms[m.i] = curstemp->platform
  808.          SKIP
  809.       ENDFOR
  810.       USE                                             && get rid of the cursor
  811.    ELSE
  812.       SELECT DISTINCT platform FROM (g_screens[1,1]) ;
  813.           WHERE IIF(INLIST(UPPER(platform), c_dos, ;
  814.             c_windows, c_mac, c_unix), .T., .F.) ;
  815.           INTO ARRAY g_platforms ;
  816.          ORDER BY platform
  817.    ENDIF
  818. ENDIF
  819.  
  820. m.numtodel = 0   && number of array elements to delete
  821. FOR m.i = 2 TO m.g_nscreens
  822.    m.g_screen = m.i
  823.    IF g_screens[m.i,6]   && DOS 2.0 screen
  824.       DIMENSION t_platforms[1]
  825.       t_platforms = ""
  826.       t_platforms[1] = "DOS"
  827.    ELSE
  828.       IF _DOS
  829.          * Avoid selecting into an array to conserve memory
  830.          SELECT DISTINCT platform FROM (g_screens[m.i,1]) ;
  831.                 WHERE IIF(INLIST(UPPER(platform), c_dos, ;
  832.                 c_windows, c_mac, c_unix), .T., .F.) ;
  833.             INTO CURSOR curstemp ;
  834.             ORDER BY platform
  835.          m.rcount = _TALLY
  836.          SELECT curstemp
  837.          DIMENSION t_platforms[m.rcount]
  838.          GOTO TOP
  839.          FOR m.k = 1 TO m.rcount
  840.             t_platforms[m.k] = curstemp->platform
  841.             SKIP
  842.          ENDFOR
  843.          USE                                             && get rid of the cursor
  844.       ELSE
  845.          SELECT DISTINCT platform FROM (g_screens[m.i,1]) ;
  846.                 WHERE IIF(INLIST(UPPER(platform), c_dos, ;
  847.                 c_windows, c_mac, c_unix), .T., .F.) ;
  848.              INTO ARRAY t_platforms ;
  849.             ORDER BY platform
  850.       ENDIF
  851.    ENDIF
  852.  
  853.    * Update g_platforms with the intersection of g_platforms
  854.    *  and t_platforms
  855.    m.j = 1
  856.    DO WHILE m.j < ALEN(g_platforms) -  m.numtodel
  857.       IF !INLIST(TYPE("g_platforms[m.j]"),"L","U") ;
  858.             AND ASCAN(t_platforms,g_platforms[m.j]) = 0
  859.          =ADEL(g_platforms,m.j)
  860.          m.numtodel = m.numtodel + 1
  861.       ELSE
  862.          m.j = m.j + 1
  863.       ENDIF
  864.    ENDDO
  865.  
  866. ENDFOR
  867. SELECT (m.in_area)
  868.  
  869. m.g_screen = 0
  870. * Shrink the unique platform array if necessary
  871. DIMENSION g_platforms[ALEN(g_platforms)-m.numtodel]
  872.  
  873. IF ALEN(g_platforms) <= 0 OR EMPTY(g_platforms[1])
  874.    WAIT WINDOW  "No common platforms in these screens.  Press any key."
  875.    CANCEL
  876. ELSE
  877.    FOR m.j = 1 TO ALEN(g_platforms)
  878.       g_platforms[m.j] = UPPER(ALLTRIM(g_platforms[m.j]))
  879.    ENDFOR
  880.  
  881.    * If the current platform is in the list of common platforms, put it at the top
  882.    m.p_cur = ASCAN(g_platforms, m.g_thisvers)
  883.    IF m.p_cur > 1
  884.       m.tempplat = g_platforms[1]
  885.       g_platforms[1] = g_platforms[m.p_cur]
  886.       g_platforms[m.p_cur] = m.tempplat
  887.    ENDIF
  888. ENDIF
  889. RETURN .T.
  890.  
  891. *!*****************************************************************************
  892. *!
  893. *!      Procedure: PREPFILE
  894. *!
  895. *!      Called by: BUILDENABLE        (procedure in GENSCRN.PRG)
  896. *!
  897. *!          Calls: ERRORHANDLER       (procedure in GENSCRN.PRG)
  898. *!
  899. *!*****************************************************************************
  900. PROCEDURE prepfile
  901. *)
  902. *) PREPFILE - Create and open the application output file.
  903. *)
  904. *) Description:
  905. *) Create or open a file that will hold the generated application.
  906. *) If error(s) encountered at any time issue an error message
  907. *) and return .F.
  908. *)
  909. PARAMETER m.filename, m.ifp
  910. PRIVATE m.msg
  911. m.ifp = FCREATE(m.filename)
  912.  
  913. IF (m.ifp = -1)
  914.    m.msg = "Cannot open "+LOWER(m.filename)
  915.    m.g_havehand = .F.
  916.    DO errorhandler WITH m.msg, LINENO(), c_error_3
  917. ELSE
  918.    m.g_havehand = .T.
  919. ENDIF
  920. RETURN
  921.  
  922. *!*****************************************************************************
  923. *!
  924. *!      Procedure: CLOSEFILE
  925. *!
  926. *!      Called by: ERRORHANDLER       (procedure in GENSCRN.PRG)
  927. *!               : BUILDDISABLE       (procedure in GENSCRN.PRG)
  928. *!
  929. *!          Calls: ERRORHANDLER       (procedure in GENSCRN.PRG)
  930. *!
  931. *!*****************************************************************************
  932. PROCEDURE closefile
  933. *)
  934. *) CLOSEFILE - Close a low level file opened with FCREATE.
  935. *)
  936. PARAMETER m.ifp
  937. IF (m.ifp > 0) AND !FCLOSE(m.ifp)
  938.    DO errorhandler WITH "Unable to close the generated file",;
  939.       LINENO(), c_error_2
  940. ENDIF
  941. RETURN
  942.  
  943. *!*****************************************************************************
  944. *!
  945. *!       Function: PREPSCREENS
  946. *!
  947. *!      Called by: GENSCRN.PRG
  948. *!               : DISPATCHBUILD      (procedure in GENSCRN.PRG)
  949. *!
  950. *!          Calls: BASENAME()         (function  in GENSCRN.PRG)
  951. *!               : SCREENUSED()       (function  in GENSCRN.PRG)
  952. *!               : NOTEAREA           (procedure in GENSCRN.PRG)
  953. *!               : GETPLATFORM()      (function  in GENSCRN.PRG)
  954. *!               : ERRORHANDLER       (procedure in GENSCRN.PRG)
  955. *!               : PREPWNAMES         (procedure in GENSCRN.PRG)
  956. *!
  957. *!*****************************************************************************
  958. FUNCTION prepscreens
  959. *)
  960. *) PREPSCREENS - Prepare screen file(s) for processing.
  961. *)
  962. *) Description:
  963. *) Called once per platform.
  964. *)
  965. *) Open PJX database, index it to find all screen files belonging
  966. *) to a screen set if part of a project.
  967. *)
  968. *) Open all screen file(s).  If screen file already opened, then
  969. *) select it.  Assign unique aliases to screen with name conflicts.
  970. *) If error is encountered while opening any of the screen files
  971. *) this program will be aborted.
  972. *)
  973. PARAMETER m.gen_version
  974.  
  975. PRIVATE m.status, m.projdbf, m.saverec, m.dbname, m.dbalias
  976. m.status = .T.
  977.  
  978. SELECT (m.g_projalias)
  979. SET SAFETY OFF
  980. INDEX ON STR(scrnorder) TO (m.g_idxfile) COMPACT
  981. SET SAFETY ON
  982. GO TOP
  983. SCAN FOR NOT DELETED() AND setid = m.g_keyno AND TYPE = 's'
  984.    m.saverec = RECNO()
  985.    m.dbname  = FULLPATH(ALLTRIM(name), m.g_projpath)
  986.    if right(m.dbname,1) = ":"
  987.       m.dbname = m.dbname + justfname(name)
  988.    endif
  989.    m.g_nscreens = m.g_nscreens + 1
  990.  
  991.    IF MOD(m.g_nscreens,5)=0
  992.       DIMENSION g_screens[ALEN(g_screens,1)+5,7]
  993.       DIMENSION g_wnames [ALEN(g_wnames)+5,C_MAXPLATFORMS]
  994.       DIMENSION g_platforms [ALEN(g_platforms)+5]
  995.       DIMENSION g_firstproc [ALEN(g_firstproc)+5]
  996.    ENDIF
  997.  
  998.    m.dbalias = LEFT(basename(m.dbname), c_aliaslen)
  999.    IF screenused(m.dbalias, m.dbname)
  1000.       g_screens[m.g_nscreens,4] = .T.
  1001.    ELSE
  1002.       g_screens[m.g_nscreens,4] = .F.
  1003.         IF FILE(m.dbname)
  1004.          SELECT 0
  1005.          USE (m.dbname) AGAIN ALIAS (g_screens[m.g_nscreens,5])
  1006.          DO notearea
  1007.         ELSE
  1008.            DO errorhandler WITH "Could not find SCX file: "+m.dbname, ;
  1009.                LINENO(),c_error_2
  1010.             RETURN .F.
  1011.        ENDIF
  1012.    ENDIF
  1013.  
  1014.    DO CASE
  1015.    CASE FCOUNT() = c_scxflds
  1016.       LOCATE FOR platform = m.gen_version
  1017.       IF FOUND()
  1018.          g_screens[m.g_nscreens,6] = .F.
  1019.          g_screens[m.g_nscreens,7] = platform
  1020.       ELSE
  1021.          g_screens[m.g_nscreens,6] = .F.
  1022.          g_screens[m.g_nscreens,7] = getplatform()
  1023.       ENDIF
  1024.    CASE FCOUNT() = c_20scxflds
  1025.       g_screens[m.g_nscreens,6] = .T.
  1026.       g_screens[m.g_nscreens,7] = "DOS"
  1027.    OTHERWISE
  1028.       DO errorhandler WITH "Screen "+m.dbalias+" is invalid",LINENO(),;
  1029.          c_error_2
  1030.       RETURN .F.
  1031.    ENDCASE
  1032.    g_screens[m.g_nscreens,1] = m.dbname
  1033.  
  1034.    IF NOT EMPTY(STYLE)
  1035.       IF EMPTY(name)
  1036.          g_screens[m.g_nscreens,2] = LOWER(SYS(2015))
  1037.       ELSE
  1038.          g_screens[m.g_nscreens,2] = ALLTRIM(LOWER(name))
  1039.       ENDIF
  1040.       DO prepwnames WITH m.g_nscreens
  1041.    ENDIF
  1042.  
  1043.    SELECT (m.g_projalias)
  1044.    GOTO RECORD m.saverec
  1045.    g_screens[m.g_nscreens,3] = m.saverec
  1046. ENDSCAN
  1047.  
  1048. RETURN m.status
  1049.  
  1050. *!*****************************************************************************
  1051. *!
  1052. *!       Function: NEWWINDOWS
  1053. *!
  1054. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  1055. *!
  1056. *!*****************************************************************************
  1057. FUNCTION newwindows
  1058. * Initialize the windows name array and other window-related
  1059. * variables for each platform.
  1060. g_wndows = ""                  && array of window names
  1061. m.g_nwindows = 0               && number of windows
  1062. m.g_lastwindow = ""            && name of last window generated for this platform
  1063. RETURN
  1064.  
  1065. *!*****************************************************************************
  1066. *!
  1067. *!       Function: NEWSCHEMES
  1068. *!
  1069. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  1070. *!
  1071. *!*****************************************************************************
  1072. FUNCTION newschemes
  1073. *)
  1074. *) NEWSCHEMES - Initialize the color schemes for each screen/platform
  1075. *)
  1076. m.g_defasch  = 0
  1077. m.g_defasch2 = 0
  1078. RETURN
  1079.  
  1080. *!*****************************************************************************
  1081. *!
  1082. *!       Function: NEWDBFS
  1083. *!
  1084. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  1085. *!
  1086. *!*****************************************************************************
  1087. FUNCTION newdbfs
  1088. *)
  1089. *) NEWDBFS - Initialize the databases name array for each platform
  1090. *)
  1091. m.g_dbfs = ""
  1092. RETURN
  1093.  
  1094. *!*****************************************************************************
  1095. *!
  1096. *!      Procedure: NEWREADCLAUSES
  1097. *!
  1098. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  1099. *!
  1100. *!*****************************************************************************
  1101. PROCEDURE newreadclauses
  1102. *)
  1103. *) NEWREADCLAUSES - Initialize the variables that control which READ and WINDOW clauses are
  1104. *)                    emitted.
  1105. *)
  1106. m.g_validtype  = ""
  1107. m.g_validname  = ""
  1108. m.g_whentype   = ""
  1109. m.g_whenname   = ""
  1110. m.g_actitype   = ""
  1111. m.g_actiname   = ""
  1112. m.g_deattype   = ""
  1113. m.g_deatname   = ""
  1114. m.g_showtype   = ""
  1115. m.g_showname   = ""
  1116. m.g_showexpr   = ""
  1117. RETURN
  1118.  
  1119. *!*****************************************************************************
  1120. *!
  1121. *!      Procedure: NEWDIRECTIVES
  1122. *!
  1123. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  1124. *!
  1125. *!*****************************************************************************
  1126. PROCEDURE newdirectives
  1127. m.g_windclauses= ""            && #WCLAUSES directive
  1128. m.g_rddir      = .F.           && Is there a #READCLAUSES directive?
  1129. m.g_rddirno    = 0             && Number of 1st screen with #READ directive
  1130. RETURN
  1131.  
  1132. *!*****************************************************************************
  1133. *!
  1134. *!       Function: GETPLATFORM
  1135. *!
  1136. *!      Called by: PREPSCREENS()      (function  in GENSCRN.PRG)
  1137. *!
  1138. *!          Calls: ERRORHANDLER       (procedure in GENSCRN.PRG)
  1139. *!
  1140. *!*****************************************************************************
  1141. FUNCTION getplatform
  1142. *)
  1143. *) GETPLATFORM - Find which Platform we are supposed to generate for.  If we are trying to
  1144. *)               generate for Windows, but there are no windows records in the SCX, use
  1145. *)               this function to determine which records to use.
  1146. *)
  1147. IF m.g_genvers = 'WINDOWS' OR m.g_genvers = 'MAC'
  1148.    LOCATE FOR platform = IIF(m.g_genvers = 'WINDOWS', 'MAC', 'WINDOWS')
  1149.    IF FOUND()
  1150.       RETURN platform
  1151.    ELSE
  1152.       LOCATE FOR platform = 'DOS'
  1153.       IF FOUND()
  1154.          RETURN 'DOS'
  1155.       ELSE
  1156.          LOCATE FOR platform = 'UNIX'
  1157.          IF FOUND()
  1158.             RETURN 'UNIX'
  1159.          ELSE
  1160.             DO errorhandler WITH "Screen "+m.dbalias+" is invalid",LINENO(),;
  1161.                c_error_2
  1162.          ENDIF
  1163.       ENDIF
  1164.    ENDIF
  1165. ELSE
  1166.    LOCATE FOR platform = IIF(m.g_genvers = 'DOS', 'UNIX', 'DOS')
  1167.    IF FOUND()
  1168.       RETURN platform
  1169.    ELSE
  1170.       LOCATE FOR platform = 'WINDOWS'
  1171.       IF FOUND()
  1172.          RETURN 'DOS'
  1173.       ELSE
  1174.          LOCATE FOR platform = 'MAC'
  1175.          IF FOUND()
  1176.             RETURN 'UNIX'
  1177.          ELSE
  1178.             DO errorhandler WITH "Screen "+m.dbalias+" is invalid",LINENO(),;
  1179.                c_error_2
  1180.          ENDIF
  1181.       ENDIF
  1182.    ENDIF
  1183. ENDIF
  1184. RETURN ""
  1185.  
  1186.  
  1187. *!*****************************************************************************
  1188. *!
  1189. *!      Procedure: PREPWNAMES
  1190. *!
  1191. *!      Called by: PREPSCREENS()      (function  in GENSCRN.PRG)
  1192. *!
  1193. *!          Calls: GETPLATNUM()       (function  in GENSCRN.PRG)
  1194. *!               : SKIPWHITESPACE()   (function  in GENSCRN.PRG)
  1195. *!
  1196. *!*****************************************************************************
  1197. PROCEDURE prepwnames
  1198. *)
  1199. *) PREPWNAMES - Store #WNAME directive strings.  They must be in the setup snippet.
  1200. *)
  1201. PARAMETER m.scrnno
  1202. PRIVATE m.lineno, m.textline
  1203. m.lineno = ATCLINE('#WNAM',setupcode)
  1204. IF m.lineno > 0
  1205.    m.textline = MLINE(setupcode,m.lineno)
  1206.    DO killcr WITH m.textline
  1207.    IF g_screens[m.scrnno,6]   && DOS 2.0 screen
  1208.       IF ATC('#WNAM',m.textline) = 1
  1209.          g_wnames[m.scrnno, getplatnum("DOS")] = skipwhitespace(m.textline)
  1210.       ENDIF
  1211.    ELSE
  1212.       IF ATC('#WNAM',m.textline) = 1
  1213.          g_wnames[m.scrnno, getplatnum(platform)] = skipwhitespace(m.textline)
  1214.       ENDIF
  1215.    ENDIF
  1216. ENDIF
  1217. RETURN
  1218.  
  1219. *!*****************************************************************************
  1220. *!
  1221. *!       Function: SCREENUSED
  1222. *!
  1223. *!      Called by: PREPSCREENS()      (function  in GENSCRN.PRG)
  1224. *!
  1225. *!          Calls: ILLEGALNAME()      (function  in GENSCRN.PRG)
  1226. *!
  1227. *!*****************************************************************************
  1228. FUNCTION screenused
  1229. *)
  1230. *) SCREENUSED - Check to see if screen file already opened.
  1231. *)
  1232. PARAMETER m.dbalias, m.fulldbname
  1233. m.dbalias = LEFT(m.dbalias,c_aliaslen)
  1234. IF NOT USED(m.dbalias)
  1235.    IF illegalname(m.dbalias)
  1236.       g_screens[m.g_nscreens,5] = "S"+SUBSTR(LOWER(SYS(3)),2,8)
  1237.    ELSE
  1238.       g_screens[m.g_nscreens,5] = m.dbalias
  1239.    ENDIF
  1240.    RETURN .F.
  1241. ENDIF
  1242. SELECT (m.dbalias)
  1243. IF RAT(".SCX",DBF())<>0 AND m.fulldbname=DBF()
  1244.    g_screens[m.g_nscreens,5] = m.dbalias
  1245.    RETURN .T.
  1246. ELSE
  1247.    g_screens[m.g_nscreens,5] = "S"+SUBSTR(LOWER(SYS(3)),2,8)
  1248. ENDIF
  1249. RETURN .F.
  1250.  
  1251. *!*****************************************************************************
  1252. *!
  1253. *!       Function: ILLEGALNAME
  1254. *!
  1255. *!      Called by: SCREENUSED()       (function  in GENSCRN.PRG)
  1256. *!
  1257. *!*****************************************************************************
  1258. FUNCTION illegalname
  1259. *)
  1260. *) ILLEGALNAME - Check if default alias will be used when this
  1261. *)               database is USEd. (i.e., 1st letter is not A-Z,
  1262. *)                a-z or '_', or any one of ramaining letters is not
  1263. *)                alphanumeric.)
  1264. *)
  1265. PARAMETER m.dname
  1266. PRIVATE m.start, m.aschar, m.length
  1267. m.length = LEN(m.dname)
  1268. m.start  = 0
  1269. IF m.length = 1
  1270.    *
  1271.    * If length 1, then check if default alias can be used,
  1272.    * i.e., name is different than A-J and a-j.
  1273.    *
  1274.    m.aschar = ASC(m.dname)
  1275.    IF (m.aschar >= 65 AND m.aschar <= 74) OR ;
  1276.          (m.aschar >= 97 AND m.aschar <= 106)
  1277.       RETURN .T.
  1278.    ENDIF
  1279. ENDIF
  1280. DO WHILE m.start < m.length
  1281.    m.start  = m.start + 1
  1282.    m.aschar = ASC(SUBSTR(m.dname, m.start, 1))
  1283.    IF m.start<>1 AND (m.aschar >= 48 AND m.aschar <= 57)
  1284.       LOOP
  1285.    ENDIF
  1286.    IF NOT ((m.aschar >= 65 AND m.aschar <= 90) OR ;
  1287.          (m.aschar >= 97 AND m.aschar <= 122) OR m.aschar = 95)
  1288.       RETURN .T.
  1289.    ENDIF
  1290. ENDDO
  1291. RETURN .F.
  1292.  
  1293. *!*****************************************************************************
  1294. *!
  1295. *!       Function: OPENPROJDBF
  1296. *!
  1297. *!      Called by: GENSCRN.PRG
  1298. *!
  1299. *!          Calls: NOTEAREA           (procedure in GENSCRN.PRG)
  1300. *!               : STRIPEXT()         (function  in GENSCRN.PRG)
  1301. *!               : ERRORHANDLER       (procedure in GENSCRN.PRG)
  1302. *!               : REFRESHPREFS       (procedure in GENSCRN.PRG)
  1303. *!               : GETWITHLIST        (procedure in GENSCRN.PRG)
  1304. *!
  1305. *!*****************************************************************************
  1306. FUNCTION openprojdbf
  1307. *)
  1308. *) OPENPROJDBF - Prepare Project dbf for processing.
  1309. *)
  1310. *) Description:
  1311. *) Check to see if projdbf has an appropriate number of fields.
  1312. *) Find the screen set record.
  1313. *) Extract information from the SETID record.
  1314. *)
  1315. PARAMETER m.projdbf, m.recno
  1316.  
  1317. SELECT 0
  1318. IF USED("projdbf")
  1319.    m.g_projalias = "P"+SUBSTR(LOWER(SYS(3)),2,8)
  1320. ELSE
  1321.    m.g_projalias = "projdbf"
  1322. ENDIF
  1323. USE (m.projdbf) ALIAS (m.g_projalias)
  1324. DO notearea
  1325. IF versnum() > "2.5"
  1326.    SET NOCPTRANS TO devinfo, arranged, symbols, object
  1327. ENDIF
  1328. m.g_errlog = stripext(m.projdbf)
  1329. m.g_projpath = SUBSTR(m.projdbf,1,RAT("\",m.projdbf))
  1330.  
  1331. IF FCOUNT() <> c_pjxflds
  1332.    IF FCOUNT() = c_pjx20flds
  1333.       DO errorhandler WITH "Invalid 2.0 project file passed to GenScrn.",;
  1334.          LINENO(), c_error_2
  1335.    ELSE
  1336.       DO errorhandler WITH "Generator out of date.",;
  1337.          LINENO(), c_error_2
  1338.    ENDIF
  1339.    RETURN .F.
  1340. ENDIF
  1341.  
  1342. DO refreshprefs
  1343. GOTO m.recno
  1344. m.g_keyno        = setid
  1345. m.g_outfile      = ALLTRIM(SUBSTR(outfile,1,AT(c_null,outfile)-1))
  1346. m.g_outfile      = FULLPATH(m.g_outfile, m.g_projpath)
  1347. IF RIGHT(m.g_outfile,1) = ":"
  1348.    m.g_outfile = m.g_outfile + justfname(outfile)
  1349. ENDIF
  1350. m.g_openfiles    = openfiles
  1351. m.g_closefiles   = closefiles
  1352. m.g_defwin       = defwinds
  1353. m.g_relwin       = relwinds
  1354. m.g_readcycle    = readcycle
  1355. m.g_readlock     = NOLOCK
  1356. m.g_readmodal    = MODAL
  1357. m.g_readborder   = nologo
  1358. m.g_multreads    = multreads
  1359. m.g_allplatforms = !savecode
  1360. DO getwithlist
  1361. RETURN
  1362.  
  1363. *!*****************************************************************************
  1364. *!
  1365. *!      Procedure: GETWITHLIST
  1366. *!
  1367. *!      Called by: OPENPROJDBF()      (function  in GENSCRN.PRG)
  1368. *!
  1369. *!*****************************************************************************
  1370. PROCEDURE getwithlist
  1371. *)
  1372. *) GETWITHLIST - Construct the list for READ level WITH clause.  The
  1373. *) window list is in the project file, stored as CR separated strings
  1374. *) possibly terminated with a NULL.
  1375. *)
  1376.  
  1377. m.g_withlist = assocwinds
  1378. * Drop any nulls
  1379. m.g_withlist = ALLTRIM(CHRTRAN(m.g_withlist, CHR(0), ""))
  1380. * Translate any CRs/LFs into commas
  1381. m.g_withlist = CHRTRAN(m.g_withlist, c_cret+c_lf, ",,")
  1382. * Sanity check for duplicate commas
  1383. m.g_withlist = STRTRAN(m.g_withlist, ",,", ",")   && shouldn't be necessary
  1384. IF RIGHT(m.g_withlist,1) = ","
  1385.    m.g_withlist = LEFT(m.g_withlist, LEN(m.g_withlist) - 1)
  1386. ENDIF
  1387. IF LEFT(m.g_withlist,1) = ","
  1388.    m.g_withlist = RIGHT(m.g_withlist, LEN(m.g_withlist) - 1)
  1389. ENDIF
  1390. RETURN
  1391.  
  1392. *!*****************************************************************************
  1393. *!
  1394. *!      Procedure: REFRESHPREFS
  1395. *!
  1396. *!      Called by: OPENPROJDBF()      (function  in GENSCRN.PRG)
  1397. *!
  1398. *!          Calls: ERRORHANDLER       (procedure in GENSCRN.PRG)
  1399. *!               : SUBDEVINFO()       (function  in GENSCRN.PRG)
  1400. *!
  1401. *!*****************************************************************************
  1402. PROCEDURE refreshprefs
  1403. *)
  1404. *) REFRESHPREFS - Refresh Documentation and Developer preferences.
  1405. *)
  1406. *) Description:
  1407. *) Get the newest preferences for documentation style and developer
  1408. *) data from the HEADER record.
  1409. *)
  1410. PRIVATE m.start
  1411. LOCATE FOR TYPE = "H"
  1412. IF NOT FOUND ()
  1413.    DO errorhandler WITH "Missing header record in "+m.projdbf,;
  1414.       LINENO(), c_error_2
  1415.    RETURN
  1416. ENDIF
  1417. IF _MAC
  1418.     * On the Mac, the home directory will be stored in homedir unless
  1419.     * it is in a non-DOS format (e.g., contains spaces), in which case
  1420.     * it is stored in the assocwinds field.  This subterfuge is to
  1421.     * maintain cross platform compatibility of the projects.
  1422.     IF !EMPTY(assocwinds)
  1423.         m.g_homedir = ALLTRIM(SUBSTR(assocwinds,1,AT(c_null,assocwinds)-1))
  1424.     ELSE
  1425.         m.g_homedir = ALLTRIM(SUBSTR(homedir,1,AT(c_null,homedir)-1))
  1426.         IF RIGHT(m.g_homedir,1) <> "\"
  1427.            m.g_homedir = m.g_homedir + "\"
  1428.         ENDIF
  1429.     ENDIF
  1430.     * There is a potential problem with the setting of the home directory on the
  1431.     * Mac when we generate a screen that isn't inside a true project. The home directory
  1432.     * will be set to the temporary file directory, which is not where we want to look for
  1433.     * relative paths. Adjust it here.
  1434.     IF UPPER(ALLTRIM(justpath(m.g_homedir))) == UPPER(sys(2023)) AND alldigits(juststem(m.g_homedir))
  1435.         SKIP
  1436.         m.g_target = name
  1437.         IF AT(CHR(0), name) > 0
  1438.             m.g_target = ALLTRIM(justpath(SUBSTR(name,1,AT(c_null,name)-1)))
  1439.         ENDIF
  1440.         m.g_homedir = FULLPATH(m.g_target, m.g_homedir)
  1441.            IF RIGHT(m.g_homedir,1) <> "\"
  1442.                m.g_homedir = m.g_homedir + "\"
  1443.         ENDIF
  1444.         SKIP -1
  1445.     ENDIF
  1446. ELSE
  1447.     m.g_homedir = ALLTRIM(SUBSTR(homedir,1,AT(c_null,homedir)-1))
  1448.     IF RIGHT(m.g_homedir,1) <> "\"
  1449.        m.g_homedir = m.g_homedir + "\"
  1450.     ENDIF
  1451. ENDIF
  1452.  
  1453. m.start = 1
  1454. m.g_devauthor = subdevinfo(m.start,c_authorlen,m.g_devauthor)
  1455.  
  1456. m.start = m.start + c_authorlen + 1
  1457. m.g_devcompany = subdevinfo(m.start,c_complen,m.g_devcompany)
  1458.  
  1459. m.start = m.start + c_complen + 1
  1460. m.g_devaddress = subdevinfo(m.start,c_addrlen,m.g_devaddress)
  1461.  
  1462. m.start = m.start + c_addrlen + 1
  1463. m.g_devcity = subdevinfo(m.start,c_citylen,m.g_devcity)
  1464.  
  1465. m.start = m.start + c_citylen + 1
  1466. m.g_devstate = subdevinfo(m.start,c_statlen,m.g_devstate)
  1467.  
  1468. m.start = m.start + c_statlen + 1
  1469. m.g_devzip = subdevinfo(m.start,c_ziplen,m.g_devzip)
  1470.  
  1471. m.start = m.start + c_ziplen + 1
  1472. m.g_devctry = subdevinfo(m.start,c_countrylen,m.g_devctry)
  1473.  
  1474. IF cmntstyle = 0
  1475.    m.g_corn1 = "╓"
  1476.    m.g_corn2 = "╖"
  1477.    m.g_corn3 = "╙"
  1478.    m.g_corn4 = "╜"
  1479.    m.g_corn5 = "╟"
  1480.    m.g_corn6 = "╢"
  1481.    m.g_horiz = "─"
  1482.    m.g_verti1 = "║"
  1483.    m.g_verti2= "║"
  1484. ENDIF
  1485. RETURN
  1486.  
  1487. *!*****************************************************************************
  1488. *!
  1489. *!       Function: ALLDIGITS
  1490. *!
  1491. *!*****************************************************************************
  1492. FUNCTION alldigits
  1493. PARAMETER m.strg
  1494. PRIVATE m.i, m.thechar, m.retval
  1495. m.retval = .T.
  1496. FOR m.i = 1 TO LEN(m.strg)
  1497.    m.thechar = SUBSTR(m.strg, m.i , 1)
  1498.    IF m.thechar < '0' OR m.thechar > '9'
  1499.       m.retval = .F.
  1500.    ENDIF
  1501. ENDFOR
  1502. RETURN m.retval
  1503.  
  1504.  
  1505. *!*****************************************************************************
  1506. *!
  1507. *!       Function: SUBDEVINFO
  1508. *!
  1509. *!      Called by: REFRESHPREFS       (procedure in GENSCRN.PRG)
  1510. *!
  1511. *!*****************************************************************************
  1512. FUNCTION subdevinfo
  1513. *)
  1514. *) SUBDEVINFO - Extract strings from the DEVINFO memo field.
  1515. *)
  1516. PARAMETER m.start, m.stop, m.default
  1517. PRIVATE m.string
  1518. m.string = SUBSTR(devinfo, m.start, m.stop+1)
  1519. m.string = SUBSTR(m.string, 1, AT(c_null,m.string)-1)
  1520. RETURN IIF(EMPTY(m.string), m.default, m.string)
  1521.  
  1522. **
  1523. ** High Level Controlling Structures in Format file generation.
  1524. **
  1525.  
  1526. *!*****************************************************************************
  1527. *!
  1528. *!      Procedure: BUILD
  1529. *!
  1530. *!      Called by: GENSCRN.PRG
  1531. *!
  1532. *!          Calls: BUILDENABLE        (procedure in GENSCRN.PRG)
  1533. *!               : ACTTHERM           (procedure in GENSCRN.PRG)
  1534. *!               : UPDTHERM           (procedure in GENSCRN.PRG)
  1535. *!               : DISPATCHBUILD      (procedure in GENSCRN.PRG)
  1536. *!               : COMBINE            (procedure in GENSCRN.PRG)
  1537. *!               : BUILDDISABLE       (procedure in GENSCRN.PRG)
  1538. *!               : DEACTTHERMO        (procedure in GENSCRN.PRG)
  1539. *!
  1540. *!*****************************************************************************
  1541. PROCEDURE BUILD
  1542. *)
  1543. *) BUILD - Controlling procedure for building of a format file.
  1544. *)
  1545. *) Description:
  1546. *) This procedure is a controlling procedure for the process of
  1547. *) generating a screen file.  It enables building, activates the
  1548. *) thermometer, calls BUILDCTRL and combines two output files,
  1549. *) and finally disables building.
  1550. *) This procedure also makes calls to UPDTHERM to
  1551. *) update the thermometer display.
  1552. *)
  1553.  
  1554. DO buildenable
  1555. DO acttherm WITH "Generating Screen Code..."
  1556. DO updtherm WITH c_therm1 * m.g_numplatforms     && 5%
  1557.  
  1558. DO dispatchbuild
  1559.  
  1560. DO updtherm WITH c_therm7 * m.g_numplatforms     && 95%
  1561. DO combine
  1562. DO updtherm WITH 100 * m.g_numplatforms   && force thermometer to complete
  1563. DO builddisable
  1564.  
  1565. DO deactthermo
  1566. RETURN
  1567.  
  1568. *!*****************************************************************************
  1569. *!
  1570. *!      Procedure: DISPATCHBUILD
  1571. *!
  1572. *!      Called by: BUILD              (procedure in GENSCRN.PRG)
  1573. *!
  1574. *!          Calls: COUNTPLATFORMS     (procedure in GENSCRN.PRG)
  1575. *!               : PREPPARAMS         (procedure in GENSCRN.PRG)
  1576. *!               : MULTIPLAT()        (function  in GENSCRN.PRG)
  1577. *!               : SCANPROC           (procedure in GENSCRN.PRG)
  1578. *!               : GENPARAMETER       (procedure in GENSCRN.PRG)
  1579. *!               : LOOKUPPLATFORM     (procedure in GENSCRN.PRG)
  1580. *!               : VERSIONCAP()       (function  in GENSCRN.PRG)
  1581. *!               : PUTMSG             (procedure in GENSCRN.PRG)
  1582. *!               : PREPSCREENS()      (function  in GENSCRN.PRG)
  1583. *!               : ERRORHANDLER       (procedure in GENSCRN.PRG)
  1584. *!               : NEWWINDOWS()       (function  in GENSCRN.PRG)
  1585. *!               : NEWDBFS()          (function  in GENSCRN.PRG)
  1586. *!               : NEWREADCLAUSES     (procedure in GENSCRN.PRG)
  1587. *!               : PUSHINDENT         (procedure in GENSCRN.PRG)
  1588. *!               : BUILDCTRL          (procedure in GENSCRN.PRG)
  1589. *!               : POPINDENT          (procedure in GENSCRN.PRG)
  1590. *!               : UPDTHERM           (procedure in GENSCRN.PRG)
  1591. *!               : GENPROCEDURES      (procedure in GENSCRN.PRG)
  1592. *!
  1593. *!*****************************************************************************
  1594. PROCEDURE dispatchbuild
  1595. *)
  1596. *) DISPATCHBUILD - Determines which platforms are to be generated and
  1597. *)                  calls BUILDCTRL for each one.
  1598. *)
  1599. PRIVATE m.i, m.thisplat, m.j
  1600. m.g_numplatforms = countplatforms()
  1601.  
  1602. DO prepparams
  1603.  
  1604. _TEXT = m.g_orghandle
  1605. _PRETEXT = ""
  1606.  
  1607. DO CASE
  1608. CASE multiplat()
  1609.    * Emit code for all common platforms in the screen set and put CASE statements
  1610.    * around the code for each one.  The g_platforms array contains the list of
  1611.    * platforms to generate for.
  1612.  
  1613.    * If generating for multiple platforms, scan all cleanup snippets and assemble an
  1614.    * array of unique procedure names.  This process is designed to handle procedure name
  1615.    * collisions across platforms.
  1616.    DO scanproc
  1617.  
  1618.    DO header   && main heading at top of program
  1619.  
  1620.    * Special case when there are multiple platforms being sent to the
  1621.    * same SPR.  Since the SPR can only have a single parameter statement,
  1622.    * and since it has to appear before the CASE _platform code, put it
  1623.    * here.
  1624.    DO genparameter
  1625.  
  1626.    m.thisplat = "X"   && placeholder value
  1627.    m.i = 1
  1628.    DO WHILE !EMPTY(m.thisplat)
  1629.       m.thisplat = lookupplatform(m.i)
  1630.       IF !EMPTY(m.thisplat)
  1631.          DO putmsg WITH "Generating code for "+versioncap(m.thisplat, m.g_dualoutput)
  1632.  
  1633.          IF m.i = 1
  1634.             \DO CASE
  1635.          ELSE
  1636.             \
  1637.          ENDIF
  1638.          DO gencasestmt WITH m.thisplat
  1639.          \
  1640.  
  1641.          * Switch the platform to generate for
  1642.          m.g_genvers = m.thisplat
  1643.  
  1644.          * Update screen array entries for the new platform, unless it's the currently
  1645.          * executing platform, in which case we did this just above.
  1646.          IF !(m.thisplat == m.g_thisvers)
  1647.             * Start with a fresh set of screens.  Prepscreens() fills in the details.
  1648.             g_nscreens = 0
  1649.             IF !prepscreens(m.thisplat)
  1650.                DO errorhandler WITH "Error initializing screens for ";
  1651.                   +PROPER(m.thisplat)+".", LINENO(), c_error_3
  1652.                CANCEL
  1653.             ENDIF
  1654.             DO newwindows      && initialize the window array
  1655.             DO newdbfs         && initialize the DBF name array
  1656.             DO newreadclauses  && initialize the read clause variables
  1657.             DO newdirectives   && initialize the directives that change from platform to platform
  1658.             DO newschemes      && initialize the scheme variables
  1659.          ENDIF
  1660.  
  1661.          DO pushindent
  1662.          DO buildctrl WITH m.thisplat, m.i, .F.
  1663.          DO popindent
  1664.       ENDIF
  1665.       m.i = m.i + 1
  1666.    ENDDO
  1667.    \
  1668.    \ENDCASE
  1669.    \
  1670.    _TEXT = m.g_tmphandle
  1671.    m.thispretext = _PRETEXT
  1672.    _PRETEXT = ""
  1673.    DO updtherm WITH c_therm6 * m.g_numplatforms  && 70%
  1674.    DO genprocedures
  1675.    _TEXT = m.g_orghandle
  1676.    _PRETEXT = m.thispretext
  1677.  
  1678. OTHERWISE                         && just outputing one platform.
  1679.    * If we are generating for a platform other than the one we are running
  1680.    * on, run through prepscreens again to assign the right platform
  1681.    * name to each of these screens.
  1682.    IF (_DOS AND g_platforms[1] <> "DOS") ;
  1683.          OR (_WINDOWS AND g_platforms[1] <> "WINDOWS") ;
  1684.          OR (_MAC AND g_platforms[1] <> "MAC") ;
  1685.          OR (_UNIX AND g_platforms[1] <> "UNIX")
  1686.       g_nscreens = 0
  1687.       IF !prepscreens(g_platforms[1])
  1688.          DO errorhandler WITH "Error initializing screens for ";
  1689.             +PROPER(m.thisplat)+".", LINENO(), c_error_3
  1690.          CANCEL
  1691.       ENDIF
  1692.    ENDIF
  1693.  
  1694.    m.g_allplatforms = .F.
  1695.    m.g_numplatforms = 1
  1696.    m.g_genvers      = g_platforms[1]
  1697.  
  1698.    DO newwindows      && Initialize the array of window names
  1699.    DO newdbfs         && Initialize the array of DBF names
  1700.    DO newreadclauses  && Initialize the read clause variables for each platform
  1701.    DO newdirectives   && Initialize the directives that change from platform to platform
  1702.    DO newschemes      && initialize the scheme variables
  1703.  
  1704.    DO header
  1705.    DO buildctrl WITH g_platforms[1], 1, .T.
  1706.  
  1707.    DO updtherm WITH  c_therm6   && 70%
  1708.    DO genprocedures
  1709. ENDCASE
  1710. RETURN
  1711.  
  1712.  
  1713. **
  1714. ** Code Associated With Building of the Control Program.
  1715. **
  1716. *!*****************************************************************************
  1717. *!
  1718. *!      Procedure: BUILDCTRL
  1719. *!
  1720. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  1721. *!
  1722. *!          Calls: HEADER             (procedure in GENSCRN.PRG)
  1723. *!               : GENPARAMETER       (procedure in GENSCRN.PRG)
  1724. *!               : GENSECT1           (procedure in GENSCRN.PRG)
  1725. *!               : GENSETENVIRON      (procedure in GENSCRN.PRG)
  1726. *!               : GENOPENDBFS        (procedure in GENSCRN.PRG)
  1727. *!               : UPDTHERM           (procedure in GENSCRN.PRG)
  1728. *!               : DEFWINDOWS         (procedure in GENSCRN.PRG)
  1729. *!               : GENSECT2           (procedure in GENSCRN.PRG)
  1730. *!               : DEFPOPUPS          (procedure in GENSCRN.PRG)
  1731. *!               : BUILDFMT           (procedure in GENSCRN.PRG)
  1732. *!               : GENCLNENVIRON      (procedure in GENSCRN.PRG)
  1733. *!               : GENCLEANUP         (procedure in GENSCRN.PRG)
  1734. *!
  1735. *!*****************************************************************************
  1736. PROCEDURE buildctrl
  1737. *)
  1738. *) BUILDCTRL - Generate Format control file.
  1739. *)
  1740. *) Description:
  1741. *) Buildctrl controls the generation process.  It invokes procedures
  1742. *) which build the output program from a set of screens.
  1743. *)
  1744. PARAMETERS m.pltfrm, m.pnum, m.putparam, m.dbalias
  1745. PRIVATE m.i
  1746.  
  1747. IF m.putparam
  1748.    * Bracketed code is handled elsewhere.  We are only emitting the parameter
  1749.    * from this platform.  Go get it again to make sure we have the right one.
  1750.    * At this point, g_parameter could contain the parameter from any platform.
  1751.  
  1752.    * Open the database for the first screen since it's the only one we can generate
  1753.    * a parameter statement for.
  1754.    m.dbalias = g_screens[1,5]
  1755.    SELECT (m.dbalias)
  1756.    DO seekheader WITH 1
  1757.  
  1758.    m.g_parameter = getparam("setupcode")
  1759.  
  1760.    DO genparameter
  1761. ENDIF
  1762. DO gensect1                                && SECTION 1 setup code
  1763. DO gensetenviron                        && environment setup code
  1764. IF m.g_openfiles
  1765.    DO genopendbfs                        && USE ... INDEX ... statements
  1766. ENDIF
  1767. DO updtherm WITH thermadj(m.pnum,c_therm2,c_therm5)    && and SET RELATIONS
  1768.  
  1769. DO defwindows                             && window definitions
  1770. DO gensect2                                && SECTION 2 setup code
  1771. DO defpopups                            && lists
  1772. DO updtherm WITH thermadj(m.pnum,c_therm3,c_therm5)
  1773.  
  1774. DO buildfmt WITH m.pnum            && @ ... SAY/GET statements
  1775.  
  1776. DO updtherm WITH thermadj(m.pnum,c_therm4,c_therm5)
  1777. IF m.g_windows AND m.g_relwin AND !m.g_noread
  1778.    * If the READ is omitted, don't produce the code to release the window.
  1779.    FOR m.i = 1 TO m.g_nwindows
  1780.       \RELEASE WINDOW <<g_wndows[m.i,1]>>
  1781.    ENDFOR
  1782. ENDIF
  1783.  
  1784. IF m.g_moddesktop AND m.g_relwin AND INLIST(m.g_genvers,"WINDOWS","MAC")
  1785.    \MODIFY WINDOW SCREEN
  1786. ENDIF
  1787.  
  1788. DO genclnenviron                        && environment cleanup code
  1789. DO updtherm WITH thermadj(m.pnum,c_therm5,c_therm5)
  1790. DO gencleanup                       && cleanup code, but not procedures/functions
  1791.  
  1792. *!*****************************************************************************
  1793. *!
  1794. *!      Procedure: GENSETENVIRON
  1795. *!
  1796. *!      Called by: BUILDCTRL          (procedure in GENSCRN.PRG)
  1797. *!
  1798. *!*****************************************************************************
  1799. PROCEDURE gensetenviron
  1800. *)
  1801. *) GENSETENVIRON - Generate environment code for the .SPR
  1802. *)
  1803. IF !m.g_noreadplain
  1804.    \
  1805.    \#REGION 0
  1806.    \REGIONAL m.currarea, m.talkstat, m.compstat
  1807.    \
  1808.    \IF SET("TALK") = "ON"
  1809.    \    SET TALK OFF
  1810.    \    m.talkstat = "ON"
  1811.    \ELSE
  1812.    \    m.talkstat = "OFF"
  1813.    \ENDIF
  1814.    \m.compstat = SET("COMPATIBLE")
  1815.    \SET COMPATIBLE FOXPLUS
  1816.  
  1817.    IF INLIST(m.g_genvers,"WINDOWS","MAC")
  1818.       \
  1819.       \m.rborder = SET("READBORDER")
  1820.       \SET READBORDER <<IIF(m.g_readborder, "ON", "OFF")>>
  1821.    ENDIF
  1822. ENDIF
  1823.  
  1824. IF m.g_closefiles
  1825.    \
  1826.    \m.currarea = SELECT()
  1827.    \
  1828. ENDIF
  1829. RETURN
  1830.  
  1831. *!*****************************************************************************
  1832. *!
  1833. *!      Procedure: GENCLNENVIRON
  1834. *!
  1835. *!      Called by: BUILDCTRL          (procedure in GENSCRN.PRG)
  1836. *!
  1837. *!          Calls: GENCLOSEDBFS       (procedure in GENSCRN.PRG)
  1838. *!               : RELPOPUPS          (procedure in GENSCRN.PRG)
  1839. *!
  1840. *!*****************************************************************************
  1841. PROCEDURE genclnenviron
  1842. *)
  1843. *) GENCLNENVIRON - Generate environment code for the .SPR
  1844. *)
  1845. IF m.g_closefiles
  1846.    DO genclosedbfs
  1847. ENDIF
  1848. IF m.g_somepops
  1849.    DO relpopups
  1850. ENDIF
  1851. IF !m.g_noreadplain
  1852.    \
  1853.    \#REGION 0
  1854.    IF INLIST(m.g_genvers,"WINDOWS","MAC")
  1855.       \
  1856.       \SET READBORDER &rborder
  1857.       \
  1858.    ENDIF
  1859.    \IF m.talkstat = "ON"
  1860.    \    SET TALK ON
  1861.    \ENDIF
  1862.    \IF m.compstat = "ON"
  1863.    \    SET COMPATIBLE ON
  1864.    \ENDIF
  1865.    \
  1866. ENDIF
  1867. RETURN
  1868.  
  1869. *!*****************************************************************************
  1870. *!
  1871. *!      Procedure: GENCLEANUP
  1872. *!
  1873. *!      Called by: BUILDCTRL          (procedure in GENSCRN.PRG)
  1874. *!
  1875. *!          Calls: MULTIPLAT()        (function  in GENSCRN.PRG)
  1876. *!               : VERSIONCAP()       (function  in GENSCRN.PRG)
  1877. *!               : PUTMSG             (procedure in GENSCRN.PRG)
  1878. *!               : SEEKHEADER         (procedure in GENSCRN.PRG)
  1879. *!               : GETFIRSTPROC()     (function  in GENSCRN.PRG)
  1880. *!               : COMMENTBLOCK       (procedure in GENSCRN.PRG)
  1881. *!               : GETPLATNAME()      (function  in GENSCRN.PRG)
  1882. *!               : WRITECODE          (procedure in GENSCRN.PRG)
  1883. *!
  1884. *!*****************************************************************************
  1885. PROCEDURE gencleanup
  1886. *)
  1887. *) GENCLEANUP - Generate Cleanup Code.
  1888. *)
  1889. PRIVATE m.i, m.dbalias, m.msg
  1890.  
  1891. IF m.g_graphic
  1892.    m.msg = 'Generating Cleanup Code'
  1893.    IF multiplat()
  1894.       m.msg = m.msg + " for "+versioncap(m.g_genvers, m.g_dualoutput)
  1895.    ENDIF
  1896.    DO putmsg WITH  m.msg
  1897. ENDIF
  1898.  
  1899. * Generate the actual cleanup code--the code that precedes procedures
  1900. * and function declarations.
  1901. FOR m.i = 1 TO m.g_nscreens
  1902.    m.g_screen = m.i
  1903.    m.dbalias = g_screens[m.i,5]
  1904.    SELECT (m.dbalias)
  1905.  
  1906.    DO seekheader WITH m.i
  1907.    IF EMPTY (proccode)
  1908.       g_firstproc[m.i] = 0
  1909.       LOOP
  1910.    ENDIF
  1911.  
  1912.    * Find the line number where the first procedure or function
  1913.    * declaration occurs
  1914.    g_firstproc[m.i] = getfirstproc("PROCCODE")
  1915.  
  1916.    IF g_firstproc[m.i] <> 1
  1917.       * Either there aren't any procedures/functions, or they
  1918.       * are below the actual cleanup code.  Emit the cleanup code.
  1919.       DO commentblock WITH g_screens[m.i,1], " Cleanup Code"
  1920.       \#REGION <<INT(m.i)>>
  1921.       DO writecode WITH proccode, getplatname(m.i), c_fromone, g_firstproc[m.i], m.i
  1922.    ENDIF
  1923. ENDFOR
  1924. m.g_screen = 0
  1925.  
  1926. RETURN
  1927.  
  1928. *!*****************************************************************************
  1929. *!
  1930. *!      Procedure: GENPROCEDURES
  1931. *!
  1932. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  1933. *!
  1934. *!          Calls: PUTMSG             (procedure in GENSCRN.PRG)
  1935. *!               : SEEKHEADER         (procedure in GENSCRN.PRG)
  1936. *!               : PUTPROCHEAD        (procedure in GENSCRN.PRG)
  1937. *!               : GETPLATNAME()      (function  in GENSCRN.PRG)
  1938. *!               : WRITECODE          (procedure in GENSCRN.PRG)
  1939. *!               : MULTIPLAT()        (function  in GENSCRN.PRG)
  1940. *!               : ISGENPLAT()        (function  in GENSCRN.PRG)
  1941. *!               : EXTRACTPROCS       (procedure in GENSCRN.PRG)
  1942. *!
  1943. *!*****************************************************************************
  1944. PROCEDURE genprocedures
  1945. *)
  1946. *) GENPROCEDURES - Generate Procedures and Functions from cleanup code.
  1947. *)
  1948. PRIVATE m.i, m.dbalias
  1949. m.msg = 'Generating Procedures and Functions'
  1950. DO putmsg WITH m.msg
  1951.  
  1952. * Go back through each of the screens and output any procedures and
  1953. * functions that are in the cleanup snippet.
  1954. FOR m.i = 1 TO m.g_nscreens
  1955.    m.g_screen = m.i
  1956.    m.g_isfirstproc = .T.  && reset this for each screen
  1957.    m.dbalias = g_screens[m.i,5]
  1958.    SELECT (m.dbalias)
  1959.    DO seekheader WITH m.i
  1960.  
  1961.    DO CASE
  1962.    CASE g_screens[m.i,6]    && DOS 2.0 screen
  1963.       IF g_firstproc[m.i] > 0
  1964.          DO putprochead WITH m.i, g_screens[m.i,1]
  1965.          DO writecode WITH proccode, getplatname(m.i), g_firstproc[m.i], c_untilend, m.i
  1966.       ENDIF
  1967.    CASE multiplat()
  1968.       * Multiple 2.5 platforms
  1969.       IF m.g_procsmatch   && all cleanup snippets in the file are the same
  1970.          * Get all the screen/platform headers from this screen file
  1971.          IF g_firstproc[m.i] > 0
  1972.             DO putprochead WITH m.i, g_screens[m.i,1]
  1973.             DO writecode WITH proccode, getplatname(m.i), g_firstproc[m.i], c_untilend, m.i
  1974.          ENDIF
  1975.       ELSE
  1976.          * The are some differences.  Look for procedure name collisions among the
  1977.          * cleanup snippets in the platforms we are generating.
  1978.          SCAN FOR objtype = c_otscreen AND isgenplat(platform)
  1979.             IF EMPTY(proccode)
  1980.                LOOP
  1981.             ENDIF
  1982.             DO putprochead WITH m.i, g_screens[m.i,1]
  1983.             DO extractprocs WITH m.i
  1984.          ENDSCAN
  1985.       ENDIF
  1986.    OTHERWISE  && just generating one 2.5 platform
  1987.       IF g_firstproc[m.i] > 0
  1988.          DO putprochead WITH m.i, g_screens[m.i,1]
  1989.          DO writecode WITH proccode, getplatname(m.i), g_firstproc[m.i], c_untilend, m.i
  1990.       ENDIF
  1991.    ENDCASE
  1992. ENDFOR
  1993. m.g_screen = 0
  1994. RETURN
  1995.  
  1996. *!*****************************************************************************
  1997. *!
  1998. *!       Function: PROCSMATCH
  1999. *!
  2000. *!      Called by: SCANPROC           (procedure in GENSCRN.PRG)
  2001. *!
  2002. *!          Calls: ISGENPLAT()        (function  in GENSCRN.PRG)
  2003. *!
  2004. *!*****************************************************************************
  2005. FUNCTION procsmatch
  2006. *)
  2007. *) PROCSMATCH - Are the CRCs for the cleanup snippets the same for all platforms in the
  2008. *)                current screen that are being generated?
  2009. *)
  2010. PRIVATE m.crccode, m.thiscode, m.in_rec
  2011.  
  2012. m.in_rec = IIF(!EOF(),RECNO(),1)
  2013. m.crccode = "0"
  2014. * Get the headers for all the platforms we are generating
  2015. SCAN FOR objtype = c_otscreen AND isgenplat(platform)
  2016.    m.thiscode = ALLTRIM(SYS(2007,proccode))
  2017.    DO CASE
  2018.    CASE m.crccode = "0"
  2019.       m.crccode = m.thiscode
  2020.    CASE m.thiscode <> m.crccode AND m.crccode <> "0"
  2021.       RETURN .F.
  2022.    ENDCASE
  2023. ENDSCAN
  2024. GOTO m.in_rec
  2025. RETURN .T.
  2026.  
  2027. *!*****************************************************************************
  2028. *!
  2029. *!       Function: ISGENPLAT
  2030. *!
  2031. *!      Called by: GENPROCEDURES      (procedure in GENSCRN.PRG)
  2032. *!               : PROCSMATCH()       (function  in GENSCRN.PRG)
  2033. *!               : SCANPROC           (procedure in GENSCRN.PRG)
  2034. *!
  2035. *!*****************************************************************************
  2036. FUNCTION isgenplat
  2037. *)
  2038. *) ISGENPLAT - Is this platform one of the ones being generated?
  2039. *)
  2040. PARAMETER m.platname
  2041. RETURN IIF(ASCAN(g_platforms,ALLTRIM(UPPER(m.platname))) > 0, .T. , .F. )
  2042.  
  2043. *!*****************************************************************************
  2044. *!
  2045. *!      Procedure: PUTPROCHEAD
  2046. *!
  2047. *!      Called by: GENPROCEDURES      (procedure in GENSCRN.PRG)
  2048. *!
  2049. *!          Calls: COMMENTBLOCK       (procedure in GENSCRN.PRG)
  2050. *!
  2051. *!*****************************************************************************
  2052. PROCEDURE putprochead
  2053. *)
  2054. *) PUTPROCHEAD - Emit the procedure and function heading if we haven't done
  2055. *)
  2056. PARAMETER m.scrnno, m.filname
  2057. IF m.g_isfirstproc
  2058.    \
  2059.    DO commentblock WITH g_screens[m.scrnno,1], " Supporting Procedures and Functions "
  2060.    \#REGION <<INT(m.scrnno)>>
  2061.    m.g_isfirstproc = .F.
  2062. ENDIF
  2063. RETURN
  2064.  
  2065. *!*****************************************************************************
  2066. *!
  2067. *!      Procedure: EXTRACTPROCS
  2068. *!
  2069. *!      Called by: GENPROCEDURES      (procedure in GENSCRN.PRG)
  2070. *!
  2071. *!          Calls: WORDNUM()          (function  in GENSCRN.PRG)
  2072. *!               : MATCH()            (function  in GENSCRN.PRG)
  2073. *!               : GETPROCNUM()       (function  in GENSCRN.PRG)
  2074. *!               : EMITPROC           (procedure in GENSCRN.PRG)
  2075. *!               : HASCONFLICT()      (function  in GENSCRN.PRG)
  2076. *!               : PUTMSG             (procedure in GENSCRN.PRG)
  2077. *!               : UPDTHERM           (procedure in GENSCRN.PRG)
  2078. *!               : PROCCOMMENTBLOCK   (procedure in GENSCRN.PRG)
  2079. *!               : EMITBRACKET        (procedure in GENSCRN.PRG)
  2080. *!
  2081. *!*****************************************************************************
  2082. PROCEDURE extractprocs
  2083. *)
  2084. *) EXTRACTPROCS - Output the procedures for the current platform in the current screen
  2085. *)
  2086. * We only get here if we are emitting for multiple platforms and the cleanup snippets
  2087. * for all platforms are not identical.  We are positioned on a screen header record for
  2088. * the g_genvers platform.
  2089. PARAMETER m.scrnno
  2090.  
  2091. PRIVATE m.hascontin, m.iscontin, m.sniplen, m.i, m.thisline, m.pnum, m.word1, m.word2
  2092.  
  2093. _MLINE = 0
  2094. m.sniplen   = LEN(proccode)
  2095. m.numlines  = MEMLINES(proccode)
  2096. m.hascontin = .F.
  2097. DO WHILE _MLINE < m.sniplen
  2098.    m.thisline  = UPPER(ALLTRIM(MLINE(proccode,1, _MLINE)))
  2099.    DO killcr WITH m.thisline
  2100.    m.iscontin  = m.hascontin
  2101.    m.hascontin = RIGHT(m.thisline,1) = ';'
  2102.    IF LEFT(m.thisline,1) $ "PF" AND !m.iscontin
  2103.       m.word1 = wordnum(m.thisline, 1)
  2104.       IF match(m.word1,"PROCEDURE") OR match(m.word1,"FUNCTION")
  2105.          m.word2 = wordnum(m.thisline,2)
  2106.          * Does this procedure have a name conflict?
  2107.          m.pnum = getprocnum(m.word2)
  2108.          IF pnum > 0
  2109.             DO CASE
  2110.             CASE g_procs[m.pnum,C_MAXPLATFORMS+2]
  2111.                * This one has already been generated.  Skip past it now.
  2112.                DO emitproc WITH .F., m.thisline, m.sniplen, m.scrnno
  2113.                LOOP
  2114.             CASE hasconflict(pnum)
  2115.                * Name collision detected.  Output bracketed code for all platforms
  2116.                DO putmsg WITH "Generating code for procedure/function ";
  2117.                   +LOWER(g_procs[m.pnum,1])
  2118.                DO updtherm WITH thermadj(m.pnum,c_therm6 + (c_therm7-c_therm6)/m.g_procnames,c_therm7)
  2119.                DO proccommentblock WITH g_screens[m.scrnno,1], " "+PROPER(word1);
  2120.                   +" " + g_procs[m.pnum,1]
  2121.                DO emitbracket WITH m.pnum, m.scrnno
  2122.             OTHERWISE
  2123.                * This procedure has no name collision and has not been emitted yet.
  2124.                DO putmsg WITH "Generating code for procedure/function ";
  2125.                   +LOWER(g_procs[m.pnum,1])
  2126.                DO updtherm WITH thermadj(m.pnum,c_therm6 + (c_therm7-c_therm6)/m.g_procnames,c_therm7)
  2127.                *DO updtherm WITH (c_therm6 + ((c_therm7-c_therm6)/g_procnames) * m.pnum) * m.g_numplatforms
  2128.                DO proccommentblock WITH g_screens[m.scrnno,1], " "+PROPER(word1);
  2129.                   +" " + g_procs[m.pnum,1]
  2130.                DO emitproc WITH .T., m.thisline, m.sniplen, m.scrnno
  2131.             ENDCASE
  2132.             g_procs[pnum,C_MAXPLATFORMS+2] = .T.
  2133.          ENDIF
  2134.       ENDIF
  2135.    ENDIF
  2136. ENDDO
  2137. RETURN
  2138.  
  2139. *!*****************************************************************************
  2140. *!
  2141. *!      Procedure: EMITPROC
  2142. *!
  2143. *!      Called by: EXTRACTPROCS       (procedure in GENSCRN.PRG)
  2144. *!
  2145. *!          Calls: WRITELINE          (procedure in GENSCRN.PRG)
  2146. *!               : WORDNUM()          (function  in GENSCRN.PRG)
  2147. *!               : MATCH()            (function  in GENSCRN.PRG)
  2148. *!
  2149. *!*****************************************************************************
  2150. PROCEDURE emitproc
  2151. *)
  2152. *) EMITPROC - Scan through the next procedure/function in the current cleanup snippet.
  2153. *)            If dowrite is TRUE, emit the code as we go.  Otherwise, just skip over it
  2154. *)            and advance _MLINE.
  2155. *)
  2156. * We are positioned on the PROCEDURE or FUNCTION line now and there isn't a name
  2157. * conflict.
  2158. PARAMETER m.dowrite, m.thisline, m.sniplen, m.scrnno
  2159. PRIVATE m.word1, m.word2, m.line, m.upline, m.done, m.lastmline, ;
  2160.    m.iscontin, m.hascontin, m.platnum
  2161.  
  2162. m.hascontin = .F.
  2163. m.done = .F.
  2164.  
  2165. * Write the PROCEDURE/FUNCTION statement
  2166. m.upline = UPPER(ALLTRIM(CHRTRAN(m.thisline,chr(9),' ')))
  2167.  
  2168. IF g_screens[m.scrnno,6]   && DOS 2.0 screen
  2169.    m.platnum = getplatnum("DOS")
  2170. ELSE
  2171.    m.platnum = getplatnum(m.g_genvers)
  2172. ENDIF
  2173.  
  2174. IF m.dowrite    && actually emit the procedure?
  2175.    DO writeline WITH m.thisline, m.g_genvers, m.platnum, m.upline, m.scrnno
  2176. ENDIF
  2177.  
  2178. * Write the body of the procedure
  2179. DO WHILE !m.done AND _MLINE < m.sniplen
  2180.    m.lastmline = _MLINE          && note where this line started
  2181.  
  2182.    m.line = MLINE(proccode,1, _MLINE)
  2183.    DO killcr WITH m.line
  2184.    m.upline = UPPER(ALLTRIM(CHRTRAN(m.line,chr(9),' ')))
  2185.  
  2186.    m.iscontin = m.hascontin
  2187.    m.hascontin = RIGHT(m.upline,1) = ';'
  2188.    IF LEFT(m.upline,1) $ "PF" AND !m.iscontin
  2189.       m.word1 = wordnum(m.upline, 1)
  2190.       IF match(m.word1,"PROCEDURE") OR match(m.word1,"FUNCTION")
  2191.          done = .T.
  2192.          _MLINE = m.lastmline    && drop back one line and stop writing
  2193.          LOOP
  2194.       ENDIF
  2195.    ENDIF
  2196.  
  2197.    IF m.dowrite    && actually emit the procedure?
  2198.       DO writeline WITH m.line, m.g_genvers, m.platnum, m.upline, m.scrnno
  2199.    ENDIF
  2200.  
  2201. ENDDO
  2202. RETURN
  2203.  
  2204. *!*****************************************************************************
  2205. *!
  2206. *!      Procedure: EMITBRACKET
  2207. *!
  2208. *!      Called by: EXTRACTPROCS       (procedure in GENSCRN.PRG)
  2209. *!
  2210. *!          Calls: PUSHINDENT         (procedure in GENSCRN.PRG)
  2211. *!               : PUTPROC            (procedure in GENSCRN.PRG)
  2212. *!               : POPINDENT          (procedure in GENSCRN.PRG)
  2213. *!
  2214. *!*****************************************************************************
  2215. PROCEDURE emitbracket
  2216. *)
  2217. *) EMITBRACKET - Emit DO CASE/CASE _DOS brackets and call putproc to emit code for this procedure
  2218. *)
  2219. PARAMETER m.pnum, m.scrnno
  2220. PRIVATE m.word1, m.word2, m.line, m.upline, m.done, m.lastmline, ;
  2221.    m.iscontin, m.hascontin, m.i
  2222. m.hascontin = .F.
  2223. m.done = .F.
  2224. \
  2225. \PROCEDURE <<g_procs[m.pnum,1]>>
  2226. IF !EMPTY(g_procs[m.pnum,C_MAXPLATFORMS+3])
  2227.    \PARAMETERS <<g_procs[m.pnum,C_MAXPLATFORMS+3]>>
  2228. ENDIF
  2229. \DO CASE
  2230.  
  2231. * Peek ahead and get the parameter statement
  2232. FOR m.platnum = 1 TO c_maxplatforms
  2233.    IF g_procs[m.pnum,m.platnum+1] < 0
  2234.       * There was no procedure for this platform
  2235.       LOOP
  2236.    ENDIF
  2237.    \CASE <<"_"+g_platlist[m.platnum]>>
  2238.    DO pushindent
  2239.    DO putproc WITH m.platnum, m.pnum, m.scrnno
  2240.    DO popindent
  2241. ENDFOR
  2242. \ENDCASE
  2243. RETURN
  2244.  
  2245. *!*****************************************************************************
  2246. *!
  2247. *!      Procedure: PUTPROC
  2248. *!
  2249. *!      Called by: EMITBRACKET        (procedure in GENSCRN.PRG)
  2250. *!
  2251. *!          Calls: WORDNUM()          (function  in GENSCRN.PRG)
  2252. *!               : MATCH()            (function  in GENSCRN.PRG)
  2253. *!               : WRITELINE          (procedure in GENSCRN.PRG)
  2254. *!
  2255. *!*****************************************************************************
  2256. PROCEDURE putproc
  2257. *)
  2258. *) PUTPROC - Write actual code for procedure procnum in platform platnum
  2259. *)
  2260. PARAMETER m.platnum, m.procnum, m.scrnno
  2261. PRIVATE m.in_rec, m.oldmine, m.done, m.line, m.upline, m.iscontin, m.hascontin, ;
  2262.    m.word1, m.word2, m.platnum
  2263.  
  2264. m.in_rec    = RECNO()
  2265. * Store the _MLINE position in the original snippet
  2266. m.oldmline  = _MLINE
  2267. m.hascontin = .F.       && the previous line was not a continuation line.
  2268. LOCATE FOR platform = g_platlist[m.platnum] AND objtype = c_otscreen
  2269. IF FOUND()
  2270.    * go to the PROCEDURE/FUNCTION statement
  2271.    _MLINE = g_procs[m.procnum,m.platnum+1]
  2272.    * Skip the PROCEDURE line, since we've already output one.
  2273.    m.line = MLINE(proccode,1, _MLINE)
  2274.    DO killcr WITH m.line
  2275.  
  2276.    * We are now positioned at the line following the procedure statement.
  2277.    * Write until the end of the snippet or the next procedure.
  2278.    m.done = .F.
  2279.    DO WHILE !m.done
  2280.       m.line = MLINE(proccode,1, _MLINE)
  2281.       DO killcr WITH m.line
  2282.       m.upline = UPPER(ALLTRIM(CHRTRAN(m.line,chr(9),' ')))
  2283.       m.iscontin = m.hascontin
  2284.       m.hascontin = RIGHT(m.upline,1) = ';'
  2285.       IF LEFT(m.upline,1) $ "PF" AND !m.iscontin
  2286.          m.word1 = wordnum(m.upline, 1)
  2287.          IF RIGHT(m.word1,1) = ';'
  2288.             m.word1 = LEFT(m.word1,LEN(m.word1)-1)
  2289.          ENDIF
  2290.  
  2291.          DO CASE
  2292.          CASE match(m.word1,"PROCEDURE") OR match(m.word1,"FUNCTION")
  2293.             * Stop when we encounter the next snippet
  2294.             m.done = .T.
  2295.             LOOP
  2296.          CASE match(m.word1,"PARAMETERS")
  2297.             * Don't output it, but keep scanning for other code
  2298.             DO WHILE m.hascontin
  2299.                m.line = MLINE(proccode,1, _MLINE)
  2300.                DO killcr WITH m.line
  2301.                m.upline = UPPER(ALLTRIM(CHRTRAN(m.line,chr(9),' ')))
  2302.                m.hascontin = RIGHT(m.upline,1) = ';'
  2303.             ENDDO
  2304.             LOOP
  2305.          ENDCASE
  2306.       ENDIF
  2307.  
  2308.       DO writeline WITH m.line, g_platlist[m.platnum], m.platnum, m.upline, m.scrnno
  2309.  
  2310.       * Stop if we've run out of snippet
  2311.       IF _MLINE >= LEN(proccode)
  2312.          m.done = .T.
  2313.       ENDIF
  2314.    ENDDO
  2315. ENDIF
  2316.  
  2317. GOTO m.in_rec
  2318. * Restore the _MLINE position in the main snippet we are outputing
  2319. _MLINE = m.oldmline
  2320. RETURN
  2321.  
  2322. *!*****************************************************************************
  2323. *!
  2324. *!       Function: GETPROCNUM
  2325. *!
  2326. *!      Called by: EXTRACTPROCS       (procedure in GENSCRN.PRG)
  2327. *!               : UPDPROCARRAY       (procedure in GENSCRN.PRG)
  2328. *!
  2329. *!*****************************************************************************
  2330. FUNCTION getprocnum
  2331. *)
  2332. *) GETPROCNUM - Return the g_procs array position of the procedure named pname
  2333. *)
  2334. PARAMETER m.pname
  2335. PRIVATE m.i
  2336. FOR m.i = 1 TO g_procnames
  2337.    IF g_procs[m.i,1] == m.pname
  2338.       RETURN m.i
  2339.    ENDIF
  2340. ENDFOR
  2341. RETURN  0
  2342.  
  2343. *!*****************************************************************************
  2344. *!
  2345. *!       Function: HASCONFLICT
  2346. *!
  2347. *!      Called by: EXTRACTPROCS       (procedure in GENSCRN.PRG)
  2348. *!
  2349. *!*****************************************************************************
  2350. FUNCTION hasconflict
  2351. *)
  2352. *) HASCONFLICT - Is there a name collision for procedure number num?
  2353. *)
  2354. PARAMETER m.num
  2355. PRIVATE m.i, m.cnt
  2356. m.cnt = 0
  2357. FOR m.i = 1 TO c_maxplatforms
  2358.    IF g_procs[m.num,m.i+1] > 0
  2359.       m.cnt = m.cnt +1
  2360.    ENDIF
  2361. ENDFOR
  2362. RETURN IIF(m.cnt > 1,.T.,.F.)
  2363.  
  2364.  
  2365. *!*****************************************************************************
  2366. *!
  2367. *!       Function: GETFIRSTPROC
  2368. *!
  2369. *!      Called by: GENCLEANUP         (procedure in GENSCRN.PRG)
  2370. *!
  2371. *!          Calls: WORDNUM()          (function  in GENSCRN.PRG)
  2372. *!               : MATCH()            (function  in GENSCRN.PRG)
  2373. *!
  2374. *!*****************************************************************************
  2375. FUNCTION getfirstproc
  2376. *)
  2377. *) GETFIRSTPROC - Find first PROCEDURE or FUNCTION statement in a cleanup
  2378. *)                snippet and return the line number on which it occurs.
  2379. *)
  2380. PARAMETER m.snipname
  2381. PRIVATE proclineno, numlines, word1, first_space
  2382. _MLINE = 0
  2383. m.numlines = MEMLINES(&snipname)
  2384. FOR m.proclineno = 1 TO m.numlines
  2385.    m.line  = MLINE(&snipname, 1, _MLINE)
  2386.    DO killcr WITH m.line
  2387.    m.line  = UPPER(LTRIM(m.line))
  2388.    m.word1 = wordnum(m.line,1)
  2389.    IF !EMPTY(m.word1) AND (match(m.word1,"PROCEDURE") OR match(m.word1,"FUNCTION"))
  2390.       RETURN m.proclineno
  2391.    ENDIF
  2392. ENDFOR
  2393. RETURN 0
  2394.  
  2395. *!*****************************************************************************
  2396. *!
  2397. *!      Procedure: SCANPROC
  2398. *!
  2399. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  2400. *!
  2401. *!          Calls: PROCSMATCH()       (function  in GENSCRN.PRG)
  2402. *!               : ISGENPLAT()        (function  in GENSCRN.PRG)
  2403. *!               : UPDPROCARRAY       (procedure in GENSCRN.PRG)
  2404. *!
  2405. *!*****************************************************************************
  2406. PROCEDURE scanproc
  2407. *)
  2408. *) SCANPROC - Find unique procedure names in cleanup snippets for all platforms
  2409. *)
  2410. PRIVATE m.in_rec
  2411. * See if all the cleanup snippets are the same.  If so, stop now.
  2412. m.g_procsmatch = .T.
  2413. FOR m.g_screen = 1 TO m.g_nscreens
  2414.    m.dbalias = g_screens[m.g_screen,5]
  2415.    SELECT (m.dbalias)
  2416.    IF !g_screens[m.g_screen,6]      && not applicable for FoxPro 2.0 screens
  2417.       m.g_procsmatch = m.g_procsmatch AND procsmatch()
  2418.     ENDIF
  2419. ENDFOR
  2420.  
  2421. IF !m.g_procsmatch
  2422.    FOR m.g_screen = 1 TO m.g_nscreens
  2423.       m.dbalias = g_screens[m.g_screen,5]
  2424.       SELECT (m.dbalias)
  2425.  
  2426.       IF !g_screens[m.g_screen,6]      && not applicable for FoxPro 2.0 screens
  2427.          SCAN FOR objtype = c_otscreen AND isgenplat(platform)
  2428.             DO updprocarray
  2429.          ENDSCAN
  2430.       ENDIF
  2431.    ENDFOR
  2432.    m.g_screen = 0
  2433. ENDIF
  2434. RETURN
  2435.  
  2436. *!*****************************************************************************
  2437. *!
  2438. *!      Procedure: UPDPROCARRAY
  2439. *!
  2440. *!      Called by: SCANPROC           (procedure in GENSCRN.PRG)
  2441. *!
  2442. *!          Calls: VERSIONCAP()       (function  in GENSCRN.PRG)
  2443. *!               : PUTMSG             (procedure in GENSCRN.PRG)
  2444. *!               : WORDNUM()          (function  in GENSCRN.PRG)
  2445. *!               : MATCH()            (function  in GENSCRN.PRG)
  2446. *!               : ADDPROCNAME        (procedure in GENSCRN.PRG)
  2447. *!               : GETPROCNUM()       (function  in GENSCRN.PRG)
  2448. *!               : CLEANPARAM()       (function  in GENSCRN.PRG)
  2449. *!               : ERRORHANDLER       (procedure in GENSCRN.PRG)
  2450. *!
  2451. *!*****************************************************************************
  2452. PROCEDURE updprocarray
  2453. *)
  2454. *) UPDPROCARRAY - Pick out the procedures names in the current cleanup snippet and call
  2455. *)                  AddProcName to update the g_procs array.
  2456. *)
  2457. PRIVATE m.i, m.numlines, m.line, m.upline, m.word1, m.word2, m.iscontin, m.hascontin, ;
  2458.    m.lastmline, m.thisproc
  2459.  
  2460. DO putmsg WITH "Scanning cleanup snippet for ";
  2461.    +versioncap( IIF(TYPE("platform")<>"U",platform,"DOS"), m.g_dualoutput )
  2462.  
  2463. _MLINE = 0
  2464. m.numlines = MEMLINES(proccode)
  2465. m.hascontin = .F.
  2466. FOR m.i = 1 TO m.numlines
  2467.    m.lastmline = _MLINE                && note starting position of this line
  2468.    m.line      = MLINE(proccode,1, _MLINE)
  2469.    DO killcr WITH m.line
  2470.    m.upline    = UPPER(ALLTRIM(m.line))
  2471.    m.iscontin  = m.hascontin
  2472.    m.hascontin = RIGHT(m.upline,1) = ';'
  2473.    IF LEFT(m.upline,1) $ "PF" AND !m.iscontin
  2474.       m.word1 = CHRTRAN(wordnum(m.upline, 1),';','')
  2475.       DO CASE
  2476.       CASE match(m.word1,"PROCEDURE") OR match(m.word1,"FUNCTION")
  2477.          m.word2 = wordnum(m.upline,2)
  2478.          DO addprocname WITH m.word2, platform, m.i, m.lastmline
  2479.          m.lastproc = m.word2
  2480.       CASE match(m.word1,"PARAMETERS")
  2481.          * Associate this parameter statement with the last procedure or function
  2482.          m.thisproc = getprocnum(m.lastproc)
  2483.          IF m.thisproc > 0
  2484.             m.thisparam = ALLTRIM(SUBSTR(m.upline,AT(' ',m.upline)+1))
  2485.             * Deal with continued PARAMETER lines
  2486.             DO WHILE m.hascontin AND m.i <= m.numlines
  2487.                m.lastmline = _MLINE                && note the starting position of this line
  2488.                m.line   = MLINE(proccode,1, _MLINE)
  2489.                DO killcr WITH m.line
  2490.                m.upline = UPPER(ALLTRIM(CHRTRAN(m.line,chr(9),' ')))
  2491.                m.thisparam = ;
  2492.                   m.thisparam + CHR(13)+CHR(10) + m.line
  2493.                m.hascontin = RIGHT(m.upline,1) = ';'
  2494.                m.i = m.i + 1
  2495.             ENDDO
  2496.             * Make sure that this parameter matches any others we've seen for this function
  2497.             DO CASE
  2498.             CASE EMPTY(g_procs[m.thisproc,C_MAXPLATFORMS+3])
  2499.                * First occurrence, or one platform has a parameter statement and another doesn't
  2500.                g_procs[m.thisproc,C_MAXPLATFORMS+3] = m.thisparam
  2501.             CASE cleanparam(m.thisparam) == cleanparam(g_procs[m.thisproc,C_MAXPLATFORMS+3])
  2502.                * It matches--do nothing
  2503.             CASE cleanparam(m.thisparam) = cleanparam(g_procs[m.thisproc,C_MAXPLATFORMS+3])
  2504.                * The new one is a superset of the existing one.  Use the longer one.
  2505.                g_procs[m.thisproc,C_MAXPLATFORMS+3] = m.thisparam
  2506.             CASE cleanparam(g_procs[m.thisproc,C_MAXPLATFORMS+3]) = cleanparam(m.thisparam)
  2507.                * The old one is a superset of the new one.  Keep the longer one.
  2508.             OTHERWISE
  2509.                DO errorhandler WITH "Different parameters for "+g_procs[m.thisproc,1],;
  2510.                   LINENO(),c_error_3
  2511.             ENDCASE
  2512.          ENDIF
  2513.       ENDCASE
  2514.    ENDIF
  2515. ENDFOR
  2516. RETURN
  2517.  
  2518. *!*****************************************************************************
  2519. *!
  2520. *!      Procedure: ADDPROCNAME
  2521. *!
  2522. *!      Called by: UPDPROCARRAY       (procedure in GENSCRN.PRG)
  2523. *!
  2524. *!          Calls: GETPLATNUM()       (function  in GENSCRN.PRG)
  2525. *!
  2526. *!*****************************************************************************
  2527. PROCEDURE addprocname
  2528. *)
  2529. *) ADDPROCNAME - Update g_procs with pname data
  2530. *)
  2531. PARAMETER m.pname, m.platname, m.linenum, m.lastmline
  2532. PRIVATE m.rnum, m.platformcol, m.i, m.j
  2533. IF EMPTY(m.pname)
  2534.    RETURN
  2535. ENDIF
  2536.  
  2537. * Look up this name in the procedures array
  2538. m.rnum = 0
  2539. FOR m.i = 1 TO m.g_procnames
  2540.    IF g_procs[m.i,1] == m.pname
  2541.       m.rnum = m.i
  2542.       EXIT
  2543.    ENDIF
  2544. ENDFOR
  2545.  
  2546. IF m.rnum = 0
  2547.    * New name
  2548.    g_procnames = m.g_procnames + 1
  2549.    DIMENSION g_procs[m.g_procnames,C_MAXPLATFORMS+3]
  2550.    g_procs[m.g_procnames,1] = UPPER(ALLTRIM(m.pname))
  2551.    FOR m.j = 1 TO c_maxplatforms
  2552.       g_procs[m.g_procnames,m.j + 1] = -1
  2553.    ENDFOR
  2554.    g_procs[m.g_procnames,C_MAXPLATFORMS+2] = .F.   && not emitted yet
  2555.    g_procs[m.g_procnames,C_MAXPLATFORMS+3] = ""    && parameter statement
  2556.    m.rnum = m.g_procnames
  2557. ENDIF
  2558.  
  2559. m.platformcol = getplatnum(m.platname) + 1
  2560. IF m.platformcol > 1
  2561.    g_procs[m.rnum, m.platformcol] = m.lastmline
  2562. ENDIF
  2563. RETURN
  2564.  
  2565. *!*****************************************************************************
  2566. *!
  2567. *!       Function: GETPLATNUM
  2568. *!
  2569. *!      Called by: PREPWNAMES         (procedure in GENSCRN.PRG)
  2570. *!               : ADDPROCNAME        (procedure in GENSCRN.PRG)
  2571. *!               : WRITECODE          (procedure in GENSCRN.PRG)
  2572. *!               : WRITELINE          (procedure in GENSCRN.PRG)
  2573. *!               : ADDTOCTRL          (procedure in GENSCRN.PRG)
  2574. *!
  2575. *!*****************************************************************************
  2576. FUNCTION getplatnum
  2577. *)
  2578. *) GETPLATNUM - Return the g_platlist array index given a platform name
  2579. *)
  2580. PARAMETER m.platname
  2581. PRIVATE m.i
  2582. FOR m.i = 1 TO c_maxplatforms
  2583.    IF g_platlist[m.i] == UPPER(ALLTRIM(m.platname))
  2584.       RETURN m.i
  2585.    ENDIF
  2586. ENDFOR
  2587. RETURN 0
  2588.  
  2589. *!*****************************************************************************
  2590. *!
  2591. *!      Procedure: GENCASESTMT
  2592. *!
  2593. *!*****************************************************************************
  2594. PROCEDURE gencasestmt
  2595. *)
  2596. *) GENCASESTMT - Generate the CASE ... statement
  2597. *)
  2598. PARAMETER m.thisplat
  2599. DO CASE
  2600. CASE m.thisplat = "WINDOWS" and !hasrecords("MAC") and hasrecords("WINDOWS")
  2601.    \CASE _WINDOWS OR _MAC   && no MAC records in screen
  2602.     m.g_dualoutput = .T.
  2603. CASE m.thisplat = "MAC" and !hasrecords("WINDOWS") and hasrecords("MAC")
  2604.    \CASE _MAC OR _WINDOWS   && no Windows records in screen
  2605.     m.g_dualoutput = .T.
  2606. CASE m.thisplat = "UNIX" and !hasrecords("DOS") and hasrecords("UNIX")
  2607.    \CASE _UNIX OR _DOS      && no DOS records in screen
  2608.     m.g_dualoutput = .T.
  2609. CASE m.thisplat = "DOS" and !hasrecords("UNIX") and hasrecords("DOS")
  2610.    \CASE _DOS OR _UNIX      && no UNIX records in screen
  2611.     m.g_dualoutput = .T.
  2612. OTHERWISE
  2613.    \CASE _<<m.thisplat>>
  2614.     m.g_dualoutput = .F.
  2615. ENDCASE
  2616. RETURN
  2617.  
  2618. *!*****************************************************************************
  2619. *!
  2620. *!      Procedure: GENPARAMETER
  2621. *!
  2622. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  2623. *!               : BUILDCTRL          (procedure in GENSCRN.PRG)
  2624. *!
  2625. *!*****************************************************************************
  2626. PROCEDURE genparameter
  2627. *)
  2628. *) GENPARAMETER - Generate the PARAMETER statement
  2629. *)
  2630. IF !EMPTY(m.g_parameter)
  2631.    \PARAMETERS <<m.g_parameter>>
  2632. ENDIF
  2633. RETURN
  2634.  
  2635. *!*****************************************************************************
  2636. *!
  2637. *!      Procedure: GENSECT1
  2638. *!
  2639. *!      Called by: BUILDCTRL          (procedure in GENSCRN.PRG)
  2640. *!
  2641. *!          Calls: MULTIPLAT()        (function  in GENSCRN.PRG)
  2642. *!               : VERSIONCAP()       (function  in GENSCRN.PRG)
  2643. *!               : PUTMSG             (procedure in GENSCRN.PRG)
  2644. *!               : SEEKHEADER         (procedure in GENSCRN.PRG)
  2645. *!               : FINDSECTION()      (function  in GENSCRN.PRG)
  2646. *!               : COMMENTBLOCK       (procedure in GENSCRN.PRG)
  2647. *!               : GETPLATNAME()      (function  in GENSCRN.PRG)
  2648. *!               : WRITECODE          (procedure in GENSCRN.PRG)
  2649. *!
  2650. *!*****************************************************************************
  2651. PROCEDURE gensect1
  2652. *)
  2653. *) GENSECT1 - Generate #SECTION 1 code for all screens.
  2654. *)
  2655. PRIVATE m.i, m.dbalias, m.string, m.loop, m.j, m.end, m.msg, m.thisline
  2656. m.msg =  'Generating Setup Code'
  2657. IF multiplat()
  2658.    m.msg = m.msg + " for "+versioncap(m.g_genvers, m.g_dualoutput)
  2659. ENDIF
  2660. DO putmsg WITH m.msg
  2661. m.string = " Setup Code - SECTION 1"
  2662.  
  2663. FOR m.i = 1 TO m.g_nscreens
  2664.    m.g_screen = m.i
  2665.  
  2666.    m.dbalias = g_screens[m.i,5]
  2667.    SELECT (m.dbalias)
  2668.    DO seekheader WITH m.i
  2669.    IF EMPTY (setupcode)
  2670.       LOOP
  2671.    ENDIF
  2672.  
  2673.    m.g_sect1start= c_fromone
  2674.    m.g_sect2start= c_untilend
  2675.    m.loop  = .F.
  2676.  
  2677.    IF ATCLINE("#SECT", setupcode) <> 0
  2678.       m.g_sect1start = findsection(1, setupcode)+1
  2679.       m.g_sect2start = findsection(2, setupcode)
  2680.    ENDIF
  2681.  
  2682.    DO notedirectives WITH (m.i)
  2683.  
  2684.    * See if there are nondirective statements in SECTION 1
  2685.    IF m.g_sect2start-m.g_sect1start <= 3
  2686.       IF m.g_sect2start = 0
  2687.          m.end = MEMLINES(setupcode)
  2688.       ELSE
  2689.          m.end = m.g_sect2start-1
  2690.       ENDIF
  2691.       m.loop = .T.
  2692.       m.j = m.g_sect1start
  2693.       DO WHILE m.j <= m.end
  2694.          m.thisline = MLINE(setupcode,m.j)
  2695.          DO killcr WITH m.thisline
  2696.          IF AT('#',m.thisline) <> 1 OR AT('#INSE',m.thisline) = 1
  2697.             m.loop = .F.
  2698.             EXIT
  2699.          ENDIF
  2700.          m.j = m.j + 1
  2701.       ENDDO
  2702.    ENDIF
  2703.    IF m.loop
  2704.       LOOP
  2705.    ENDIF
  2706.    IF NOT (m.g_sect1start=1 OR (m.g_sect1start=m.g_sect2start) OR ;
  2707.          (m.g_sect2start<>0 AND m.g_sect1start>m.g_sect2start))
  2708.  
  2709.       DO commentblock WITH g_screens[m.i,1], m.string
  2710.       \#REGION <<INT(m.i)>>
  2711.       _MLINE = 0
  2712.       DO writecode WITH setupcode, getplatname(m.i), m.g_sect1start, m.g_sect2start, m.i, 'setup'
  2713.    ENDIF
  2714. ENDFOR
  2715. m.g_screen = 0
  2716. RETURN
  2717.  
  2718. *!*****************************************************************************
  2719. *!
  2720. *!      Procedure: GENSECT2
  2721. *!
  2722. *!      Called by: BUILDCTRL          (procedure in GENSCRN.PRG)
  2723. *!
  2724. *!          Calls: SEEKHEADER         (procedure in GENSCRN.PRG)
  2725. *!               : FINDSECTION()      (function  in GENSCRN.PRG)
  2726. *!               : NOTEDIRECTIVES     (procedure in GENSCRN.PRG)
  2727. *!               : COUNTDIRECTIVES()  (function  in GENSCRN.PRG)
  2728. *!               : COMMENTBLOCK       (procedure in GENSCRN.PRG)
  2729. *!               : GETPLATNAME()      (function  in GENSCRN.PRG)
  2730. *!               : WRITECODE          (procedure in GENSCRN.PRG)
  2731. *!
  2732. *!*****************************************************************************
  2733. PROCEDURE gensect2
  2734. *)
  2735. *) GENSECT2 - Generate Setup code #SECTION 2.
  2736. *)
  2737. PRIVATE m.i, m.dbalias, m.string, m.endline, m.srtline, ;
  2738.    m.linecnt, m.lcnt, m.sect1, m.sect2
  2739. m.string = " Setup Code - SECTION 2"
  2740.  
  2741. FOR m.i = 1 TO m.g_nscreens
  2742.    m.g_screen = m.i
  2743.    m.dbalias = g_screens[m.i,5]
  2744.    SELECT (m.dbalias)
  2745.    DO seekheader WITH m.i
  2746.    IF EMPTY (setupcode)
  2747.       LOOP
  2748.    ENDIF
  2749.  
  2750.    m.g_sect1start= c_fromone
  2751.    m.g_sect2start= c_untilend
  2752.    m.loop  = .F.
  2753.  
  2754.    IF ATCLINE("#SECT", setupcode)<>0
  2755.       m.g_sect1start = findsection(1, setupcode)+1
  2756.       m.g_sect2start = findsection(2, setupcode)
  2757.    ENDIF
  2758.  
  2759.    m.sect1 = m.g_sect1start <> 0
  2760.    m.sect2 = m.g_sect2start <> 0
  2761.  
  2762.    DO notedirectives WITH (m.i)
  2763.    m.lcnt = countdirectives(m.sect1, m.sect2, m.i)
  2764.  
  2765.    IF m.g_sect2start = 0 AND m.g_sect1start > 1
  2766.       * No Section2 to emit
  2767.       LOOP
  2768.    ENDIF
  2769.  
  2770.    m.linecnt = MEMLINES(setupcode)
  2771.  
  2772.    IF m.linecnt > m.lcnt AND m.g_sect2start < m.linecnt
  2773.       DO commentblock WITH g_screens[m.i,1], m.string
  2774.       \#REGION <<INT(m.i)>>
  2775.       DO writecode WITH setupcode, getplatname(m.i), m.g_sect2start, c_untilend, m.i, 'setup'
  2776.    ENDIF
  2777. ENDFOR
  2778. m.g_screen = 0
  2779. RETURN
  2780.  
  2781. *!*****************************************************************************
  2782. *!
  2783. *!       Function: COUNTDIRECTIVES
  2784. *!
  2785. *!      Called by: GENSECT2           (procedure in GENSCRN.PRG)
  2786. *!
  2787. *!*****************************************************************************
  2788. FUNCTION countdirectives
  2789. *)
  2790. *) COUNTDIRECTIVES - Count directives in setup snippet.
  2791. *)
  2792. *) This function counts the directives in setup.  It is used to figure out if there
  2793. *) are any non-directive statements in the setup snippet.
  2794. PARAMETER m.sect1, m.sect2, m.scrnno
  2795. PRIVATE m.numlines, m.i, m.lcnt, m.thisline, m.upline
  2796. m.lcnt = 0
  2797. IF AT('#',setupcode) > 0
  2798.    * AT test is optimization to avoid processing the snippet when there are no directives
  2799.    m.numlines = MEMLINES(setupcode)
  2800.    _MLINE = 0
  2801.    FOR m.i = 1 TO m.numlines
  2802.       m.thisline = MLINE(setupcode, 1, _MLINE)
  2803.       DO killcr WITH m.thisline
  2804.       m.upline = UPPER(ALLTRIM(CHRTRAN(m.thisline,chr(9),' ')))
  2805.       IF LEFT(m.upline,1) = '#' AND !(LEFT(m.upline,5) = "#INSE")
  2806.          m.lcnt = m.lcnt + 1
  2807.       ENDIF
  2808.    ENDFOR
  2809. ENDIF
  2810. RETURN m.lcnt
  2811.  
  2812. *!*****************************************************************************
  2813. *!
  2814. *!      Procedure: NOTEDIRECTIVES
  2815. *!
  2816. *!      Called by: GENSECT2           (procedure in GENSCRN.PRG)
  2817. *!
  2818. *!*****************************************************************************
  2819. PROCEDURE notedirectives
  2820. *)
  2821. *) NOTEDIRECTIVES - Check for global directives such as #READCLAUSES, #NOREAD
  2822. *)
  2823. *) This function notes certain directives in the setup snippet and populates various
  2824. *) global variables so that we don't have to keep going back to the snippet to find
  2825. *) things.
  2826. PARAMETERS m.scrnno
  2827. PRIVATE m.numlines, m.i, m.thisline, m.upline
  2828. m.g_noread    = .F.
  2829. m.g_noreadplain = .F.
  2830. IF AT('#',setupcode) > 0
  2831.    * AT test is optimization to avoid processing the snippet when there are no directives
  2832.    m.numlines = MEMLINES(setupcode)
  2833.    _MLINE = 0
  2834.    FOR m.i = 1 TO m.numlines
  2835.       m.thisline = MLINE(setupcode, 1, _MLINE)
  2836.       DO killcr WITH m.thisline
  2837.       m.upline = UPPER(ALLTRIM(CHRTRAN(m.thisline,chr(9),' ')))
  2838.       IF LEFT(m.upline,1) = '#'
  2839.          DO CASE
  2840.          CASE LEFT(m.upline,5) = "#READ"   && #READCLAUSES - Additional READ clauses
  2841.             IF m.g_rddir = .F.
  2842.                m.g_rddir = .T.
  2843.                m.g_rddirno = m.scrnno
  2844.             ENDIF
  2845.          CASE LEFT(m.upline,5) = "#NORE"   && #NOREAD - omit the READ statement
  2846.             m.g_noread = .T.
  2847.             IF AT(m.g_dblampersand,m.upline) > 0
  2848.                m.upline = LEFT(m.upline,AT(m.g_dblampersand,m.upline)-1)
  2849.             ENDIF
  2850.             m.g_noreadplain = IIF(ATC(' PLAI',m.upline) > 0,.T.,.F.)
  2851.             IF m.g_noreadplain
  2852.                 m.g_openfiles    = .F.
  2853.                     m.g_closefiles   = .F.
  2854.                     m.g_defwin       = .F.
  2855.                     m.g_relwin       = .F.
  2856.             ENDIF
  2857.          ENDCASE
  2858.       ENDIF
  2859.    ENDFOR
  2860. ENDIF
  2861. RETURN
  2862.  
  2863. *!*****************************************************************************
  2864. *!
  2865. *!       Function: FINDSECTION
  2866. *!
  2867. *!      Called by: GENSECT1           (procedure in GENSCRN.PRG)
  2868. *!               : GENSECT2           (procedure in GENSCRN.PRG)
  2869. *!
  2870. *!*****************************************************************************
  2871. FUNCTION findsection
  2872. *)
  2873. *) FINDSECTION - Find #SECT... directive.
  2874. *)
  2875. *) Description:
  2876. *) Locate and return the line on which the generator directive '#SECT'
  2877. *) is located on.  If no valid directive found, return 0.
  2878. *)
  2879. PARAMETER m.sectionid, m.memo
  2880. PRIVATE m.line, m.linecnt, m.textline
  2881. m.line    = ATCLINE("#SECT", m.memo)
  2882. m.linecnt = MEMLINE(m.memo)
  2883. DO WHILE m.line <= m.linecnt
  2884.    m.textline = LTRIM(MLINE(m.memo, m.line))
  2885.    DO killcr WITH m.textline
  2886.    IF ATC("#SECT", m.textline)=1
  2887.       IF m.sectionid = 1
  2888.          IF AT("1", m.textline)<>0
  2889.             m.sect1 = .T.
  2890.             RETURN m.line
  2891.          ELSE
  2892.             RETURN 0
  2893.          ENDIF
  2894.       ELSE
  2895.          IF AT("2", m.textline)<>0
  2896.             m.sect2 = .T.
  2897.             RETURN m.line
  2898.          ENDIF
  2899.       ENDIF
  2900.    ENDIF
  2901.    m.line = m.line + 1
  2902. ENDDO
  2903. RETURN 0
  2904.  
  2905. *!*****************************************************************************
  2906. *!
  2907. *!      Procedure: WRITECODE
  2908. *!
  2909. *!      Called by: GENCLEANUP         (procedure in GENSCRN.PRG)
  2910. *!               : GENPROCEDURES      (procedure in GENSCRN.PRG)
  2911. *!               : GENSECT1           (procedure in GENSCRN.PRG)
  2912. *!               : GENSECT2           (procedure in GENSCRN.PRG)
  2913. *!               : GENVALIDBODY       (procedure in GENSCRN.PRG)
  2914. *!               : GENWHENBODY        (procedure in GENSCRN.PRG)
  2915. *!               : ACTICLAUSE         (procedure in GENSCRN.PRG)
  2916. *!               : DEATCLAUSE         (procedure in GENSCRN.PRG)
  2917. *!               : SHOWCLAUSE         (procedure in GENSCRN.PRG)
  2918. *!               : INSERTFILE         (procedure in GENSCRN.PRG)
  2919. *!
  2920. *!          Calls: GETPLATNUM()       (function  in GENSCRN.PRG)
  2921. *!               : GENINSERTCODE      (procedure in GENSCRN.PRG)
  2922. *!               : ISPARAMETER()      (function  in GENSCRN.PRG)
  2923. *!               : ATWNAME()          (function  in GENSCRN.PRG)
  2924. *!               : ISCOMMENT()        (function  in GENSCRN.PRG)
  2925. *!               : WRITELINE          (procedure in GENSCRN.PRG)
  2926. *!
  2927. *!*****************************************************************************
  2928. PROCEDURE writecode
  2929. *)
  2930. *) WRITECODE - Write contents of a memo to a low level file.
  2931. *)
  2932. *) Description:
  2933. *) Receive a memo field as a parameter and write its contents out
  2934. *) to the currently opened low level file whose handle is stored
  2935. *) in the system memory variable _TEXT.  Contents of the system
  2936. *) memory variable _PRETEXT will affect the positioning of the
  2937. *) generated text.
  2938. *)
  2939. PARAMETER m.memo, m.platname, m.start, m.end, m.scrnno, m.insetup
  2940. PRIVATE m.linecnt, m.i, m.line, m.upline, m.expr, m.platnum, m.at, m.in_exact
  2941.  
  2942. m.in_exact = SET("EXACT")
  2943. SET EXACT OFF
  2944.  
  2945. _MLINE = 0
  2946.  
  2947. m.start = MAX(1,m.start)  && if zero, start at 1
  2948.  
  2949. IF m.end > m.start
  2950.    m.linecnt = m.end-1
  2951. ELSE
  2952.    m.linecnt = MEMLINES(m.memo)
  2953. ENDIF
  2954.  
  2955. m.platnum = getplatnum(m.platname)
  2956.  
  2957. FOR m.i = 1 TO m.start - 1
  2958.    m.line = MLINE(m.memo, 1, _MLINE)
  2959. ENDFOR
  2960.  
  2961. * Window substitution names
  2962. m.subwindname = g_wnames[m.scrnno,m.platnum]
  2963. m.emptysubwind = IIF(EMPTY(m.subwindname),.T.,.F.)
  2964.  
  2965. IF NOT EMPTY(m.insetup)
  2966.    FOR m.i = m.start TO m.linecnt
  2967.       m.line = MLINE(m.memo, 1, _MLINE)
  2968.       DO killcr WITH m.line
  2969.       m.upline = UPPER(ALLTRIM(CHRTRAN(m.line,chr(9),' ')))
  2970.       IF !geninsertcode(@upline,m.scrnno, m.insetup, m.platname)
  2971.          m.isparam =  isparameter(@upline)
  2972.          DO CASE
  2973.          CASE m.isparam
  2974.             * Accumulate continuation line but don't output it.
  2975.             DO WHILE RIGHT(m.upline,1) = ';'
  2976.                m.line = MLINE(m.memo, 1, _MLINE)
  2977.                m.upline = m.upline + ALLTRIM(UPPER(m.line))
  2978.                m.i = m.i + 1
  2979.             ENDDO
  2980.             DO killcr WITH m.line
  2981.          CASE m.upline = "#"
  2982.                * don't output a generator directive, but #DEFINES are OK
  2983.                IF LEFT(m.upline,5) = "#DEFI" ;
  2984.                     OR LEFT(m.upline,3) = "#IF" ;
  2985.                     OR LEFT(m.upline,5) = "#ELSE" ;
  2986.                     OR LEFT(m.upline,6) = "#ENDIF" ;
  2987.                     OR LEFT(m.upline,8) = "#INCLUDE"
  2988.                 \<<m.line>>
  2989.                 ENDIF
  2990.            CASE m.emptysubwind    && the most common case
  2991.             \<<m.line>>
  2992.          OTHERWISE
  2993.             m.at = atwname(m.subwindname, m.line)
  2994.             IF m.at <> 0 AND !iscomment(@upline)
  2995.                m.expr = STUFF(m.line, m.at, ;
  2996.                   LEN(m.subwindname), ;
  2997.                   g_screens[m.scrnno,2])
  2998.                \<<m.expr>>
  2999.             ELSE
  3000.                \<<m.line>>
  3001.             ENDIF
  3002.          ENDCASE
  3003.       ENDIF
  3004.    ENDFOR
  3005. ELSE   && not in setup
  3006.    FOR m.i = m.start TO m.linecnt
  3007.       m.line = MLINE(m.memo, 1, _MLINE)
  3008.       DO killcr WITH m.line
  3009.       m.upline = UPPER(LTRIM(CHRTRAN(m.line,chr(9),' ')))
  3010.       DO writeline WITH m.line, m.platname, m.platnum, m.upline, m.scrnno
  3011.    ENDFOR
  3012. ENDIF
  3013. SET EXACT &in_exact
  3014. RETURN
  3015.  
  3016. *!*****************************************************************************
  3017. *!
  3018. *!      Procedure: WRITELINE
  3019. *!
  3020. *!      Called by: EMITPROC           (procedure in GENSCRN.PRG)
  3021. *!               : PUTPROC            (procedure in GENSCRN.PRG)
  3022. *!               : WRITECODE          (procedure in GENSCRN.PRG)
  3023. *!
  3024. *!          Calls: GETPLATNUM()       (function  in GENSCRN.PRG)
  3025. *!               : GENINSERTCODE      (procedure in GENSCRN.PRG)
  3026. *!               : ATWNAME()          (function  in GENSCRN.PRG)
  3027. *!               : ISCOMMENT()        (function  in GENSCRN.PRG)
  3028. *!
  3029. *!*****************************************************************************
  3030. PROCEDURE writeline
  3031. *)
  3032. *) WRITELINE - Emit a single line
  3033. *)
  3034. PARAMETER m.line, m.platname, m.platnum, m.upline, m.scrnno
  3035. PRIVATE m.at, m.expr
  3036.  
  3037. IF !geninsertcode(@upline, m.scrnno, .F., m.platname)   && by reference to save time
  3038.    IF !EMPTY(g_wnames[m.scrnno, m.platnum])
  3039.       m.at = atwname(g_wnames[m.scrnno, m.platnum], m.line)
  3040.       IF m.at <> 0 AND !iscomment(@upline)
  3041.          m.expr = STUFF(m.line, m.at, ;
  3042.             LEN(g_wnames[m.scrnno, m.platnum]), ;
  3043.             g_screens[m.scrnno,2])
  3044.          \<<m.expr>>
  3045.       ELSE
  3046.          IF !INLIST(LEFT(m.upline,2),"*!","*:") ;
  3047.                AND AT('#NAME', m.upline) <> 1
  3048.             \<<m.line>>
  3049.          ENDIF
  3050.       ENDIF
  3051.    ELSE
  3052.        * This code relies upon partial matching (e.g., "*! Comment" will equal "*")
  3053.       DO CASE
  3054.         CASE m.upline = "*"
  3055.            IF !(m.upline = "*!" OR m.upline = "*:")
  3056.             \<<m.line>>
  3057.             ENDIF
  3058.         CASE m.upline = "#"
  3059.            * don't output a generator directive, but #DEFINES are OK
  3060.            IF LEFT(m.upline,5) = "#DEFI" ;
  3061.                     OR LEFT(m.upline,3) = "#IF" ;
  3062.                     OR LEFT(m.upline,5) = "#ELSE" ;
  3063.                     OR LEFT(m.upline,6) = "#ENDIF" ;
  3064.                     OR LEFT(m.upline,8) = "#INCLUDE"
  3065.             \<<m.line>>
  3066.            ENDIF
  3067.         OTHERWISE
  3068.          \<<m.line>>
  3069.       ENDCASE
  3070.    ENDIF
  3071. ENDIF
  3072. RETURN
  3073.  
  3074. *!*****************************************************************************
  3075. *!
  3076. *!      Procedure: GENINSERTCODE
  3077. *!
  3078. *!      Called by: WRITECODE          (procedure in GENSCRN.PRG)
  3079. *!               : WRITELINE          (procedure in GENSCRN.PRG)
  3080. *!               : ADDTOCTRL          (procedure in GENSCRN.PRG)
  3081. *!
  3082. *!          Calls: WORDNUM()          (function  in GENSCRN.PRG)
  3083. *!               : INSERTFILE         (procedure in GENSCRN.PRG)
  3084. *!
  3085. *!*****************************************************************************
  3086. PROCEDURE geninsertcode
  3087. *)
  3088. *) GENINSERTCODE - Emit code from the #insert file, if any
  3089. *)
  3090. *) Strg has to be trimmed before entering GenInsertCode.  It may be passed by reference.
  3091. PARAMETER m.strg, m.scrnno, m.insetup, m.platname
  3092. PRIVATE m.word1, m.filname
  3093. IF AT("#INSE",m.strg) = 1
  3094.    m.word1 = wordnum(m.strg,1)
  3095.    m.filname = SUBSTR(m.strg,LEN(m.word1)+1)
  3096.    m.filname = ALLTRIM(CHRTRAN(m.filname,CHR(9)," "))
  3097.    DO insertfile WITH m.filname, m.scrnno, m.insetup, m.platname
  3098.    RETURN .T.
  3099. ELSE
  3100.    RETURN .F.
  3101. ENDIF
  3102. RETURN
  3103.  
  3104. *!*****************************************************************************
  3105. *!
  3106. *!       Function: ISPARAMETER
  3107. *!
  3108. *!      Called by: WRITECODE          (procedure in GENSCRN.PRG)
  3109. *!
  3110. *!          Calls: MATCH()            (function  in GENSCRN.PRG)
  3111. *!               : WORDNUM()          (function  in GENSCRN.PRG)
  3112. *!
  3113. *!*****************************************************************************
  3114. FUNCTION isparameter
  3115. *)
  3116. *) ISPARAMETER - Determine if strg is a PARAMETERS statement
  3117. *)
  3118. PARAMETER m.strg
  3119. PRIVATE m.ispar
  3120. m.ispar = .F.
  3121. IF !EMPTY(strg) AND match(CHRTRAN(wordnum(strg,1),';',''),"PARAMETERS")
  3122.    m.ispar = .T.
  3123. ENDIF
  3124. RETURN m.ispar
  3125.  
  3126. *!*****************************************************************************
  3127. *!
  3128. *!       Function: ATWNAME
  3129. *!
  3130. *!      Called by: WRITECODE          (procedure in GENSCRN.PRG)
  3131. *!               : WRITELINE          (procedure in GENSCRN.PRG)
  3132. *!               : ADDTOCTRL          (procedure in GENSCRN.PRG)
  3133. *!
  3134. *!*****************************************************************************
  3135. FUNCTION atwname
  3136. *)
  3137. *) ATWNAME - Determine if valid m.string is in this line.
  3138. *)
  3139. *) Description:
  3140. *) Make sure that if m.string is in fact the string we want to do
  3141. *) the substitution on.
  3142. *)
  3143. PARAMETER m.string, m.line
  3144. PRIVATE m.pos, m.before, m.after
  3145. m.pos = AT(m.string,m.line)
  3146. IF m.pos = 0
  3147.    RETURN 0
  3148. ENDIF
  3149. IF m.pos = 1
  3150.    m.pos = AT(m.string+" ",m.line)
  3151. ELSE
  3152.    IF m.pos = LEN(m.line) - LEN(m.string) + 1
  3153.       m.pos = AT(" "+m.string,m.line)
  3154.       m.pos = IIF(m.pos<>0, m.pos+1,m.pos)
  3155.    ELSE
  3156.       m.before = SUBSTR(m.line,m.pos-1,1)
  3157.  
  3158.       IF m.before = c_under OR ;
  3159.             (m.before >= '0' AND m.before <= '9') OR ;
  3160.             (m.before >= 'a' AND m.before <= 'z') OR ;
  3161.             (m.before >= 'A' AND m.before <= 'Z')
  3162.  
  3163.          RETURN 0
  3164.       ENDIF
  3165.       m.after = SUBSTR(m.line,m.pos+LEN(m.string),1)
  3166.  
  3167.       IF m.after = c_under OR ;
  3168.             (m.after >= '0' AND m.after <= '9') OR ;
  3169.             (m.after >= 'a' AND m.after <= 'z') OR ;
  3170.             (m.after >= 'A' AND m.after <= 'Z')
  3171.  
  3172.          RETURN 0
  3173.       ENDIF
  3174.    ENDIF
  3175. ENDIF
  3176. RETURN m.pos
  3177.  
  3178. *!*****************************************************************************
  3179. *!
  3180. *!       Function: ISCOMMENT
  3181. *!
  3182. *!      Called by: WRITECODE          (procedure in GENSCRN.PRG)
  3183. *!               : WRITELINE          (procedure in GENSCRN.PRG)
  3184. *!               : ADDTOCTRL          (procedure in GENSCRN.PRG)
  3185. *!               : GETPARAM()         (function  in GENSCRN.PRG)
  3186. *!
  3187. *!*****************************************************************************
  3188. FUNCTION iscomment
  3189. *)
  3190. *) ISCOMMENT - Determine if textline is a comment line.
  3191. *)
  3192. PARAMETER m.textline
  3193. PRIVATE m.asterisk, m.isnote, m.ampersand, m.statement
  3194. IF EMPTY(m.textline)
  3195.    RETURN .F.
  3196. ENDIF
  3197. m.statement = UPPER(LTRIM(m.textline))
  3198.  
  3199. m.asterisk  = AT("*", m.statement)
  3200. m.ampersand = AT(m.g_dblampersand, m.statement)
  3201. m.isnote    = AT("NOTE", m.statement)
  3202.  
  3203. DO CASE
  3204. CASE (m.asterisk = 1 OR m.ampersand = 1)
  3205.    RETURN .T.
  3206. CASE (m.isnote = 1 ;
  3207.       AND (LEN(m.statement) <= 4 OR SUBSTR(m.statement,5,1) = ' '))
  3208.    * Don't be fooled by something like "notebook = 7"
  3209.    RETURN .T.
  3210. ENDCASE
  3211. RETURN .F.
  3212.  
  3213. *!*****************************************************************************
  3214. *!
  3215. *!      Procedure: GENCLAUSECODE
  3216. *!
  3217. *!      Called by: PLACEREAD          (procedure in GENSCRN.PRG)
  3218. *!               : DOPLACECLAUSE      (procedure in GENSCRN.PRG)
  3219. *!
  3220. *!          Calls: VALICLAUSE         (procedure in GENSCRN.PRG)
  3221. *!               : WHENCLAUSE         (procedure in GENSCRN.PRG)
  3222. *!               : ACTICLAUSE         (procedure in GENSCRN.PRG)
  3223. *!               : DEATCLAUSE         (procedure in GENSCRN.PRG)
  3224. *!               : SHOWCLAUSE         (procedure in GENSCRN.PRG)
  3225. *!
  3226. *!*****************************************************************************
  3227. PROCEDURE genclausecode
  3228. *)
  3229. *) GENCLAUSECODE - Generate code for all read-level clauses.
  3230. *)
  3231. *) Description:
  3232. *) Generate functions containing the code from each screen's
  3233. *) READ level valid, show, when, activate, and deactivate clauses.
  3234. *)
  3235. PARAMETER m.screenno
  3236. DO valiclause WITH m.screenno
  3237. DO whenclause WITH m.screenno
  3238. DO acticlause WITH m.screenno
  3239. DO deatclause WITH m.screenno
  3240. DO showclause WITH m.screenno
  3241. RETURN
  3242.  
  3243. *!*****************************************************************************
  3244. *!
  3245. *!      Procedure: VALICLAUSE
  3246. *!
  3247. *!      Called by: GENCLAUSECODE      (procedure in GENSCRN.PRG)
  3248. *!
  3249. *!          Calls: GENFUNCHEADER      (procedure in GENSCRN.PRG)
  3250. *!               : GENVALIDBODY       (procedure in GENSCRN.PRG)
  3251. *!
  3252. *!*****************************************************************************
  3253. PROCEDURE valiclause
  3254. *)
  3255. *) VALICLAUSE - Generate Read level Valid clause function.
  3256. *)
  3257. *) Description:
  3258. *) Generate the function containing the code segment(s) provided
  3259. *) by the user for the read level VALID clause.
  3260. *) If multiple reads have been chosen, then this procedure generates
  3261. *) a function for a single screen.
  3262. *) If single read has been chosen and there are multiple screens,
  3263. *) we will concatenate valid clause code segments form all screens
  3264. *) to form a single function.
  3265. *)
  3266. PARAMETER m.screenno
  3267. PRIVATE m.i, m.dbalias, m.thispretext
  3268.  
  3269. IF m.g_validtype = "EXPR" OR EMPTY(m.g_validtype)
  3270.    RETURN
  3271. ENDIF
  3272. DO genfuncheader WITH m.g_validname, "Read Level Valid", .T.
  3273. \FUNCTION <<m.g_validname>>     && Read Level Valid
  3274.  
  3275. m.thispretext = _PRETEXT
  3276. _PRETEXT = ""
  3277. IF m.g_multreads
  3278.    DO genvalidbody WITH m.screenno
  3279. ELSE
  3280.    FOR m.i = 1 TO m.g_nscreens
  3281.       m.g_screen = m.i
  3282.       m.dbalias = g_screens[m.i,5]
  3283.       SELECT (m.dbalias)
  3284.       DO genvalidbody WITH m.i
  3285.    ENDFOR
  3286.    m.g_screen = 0
  3287. ENDIF
  3288. _PRETEXT = m.thispretext
  3289. RETURN
  3290.  
  3291. *!*****************************************************************************
  3292. *!
  3293. *!      Procedure: GENVALIDBODY
  3294. *!
  3295. *!      Called by: VALICLAUSE         (procedure in GENSCRN.PRG)
  3296. *!
  3297. *!          Calls: ERRORHANDLER       (procedure in GENSCRN.PRG)
  3298. *!               : BASENAME()         (function  in GENSCRN.PRG)
  3299. *!               : GENCOMMENT         (procedure in GENSCRN.PRG)
  3300. *!               : GETPLATNAME()      (function  in GENSCRN.PRG)
  3301. *!               : WRITECODE          (procedure in GENSCRN.PRG)
  3302. *!
  3303. *!*****************************************************************************
  3304. PROCEDURE genvalidbody
  3305. *)
  3306. *) GENVALIDBODY - Put out contents of a valid memo field.
  3307. *)
  3308. PARAMETER m.region
  3309. PRIVATE m.name, m.pos
  3310.  
  3311. IF g_screens[m.region, 6]
  3312.    LOCATE FOR objtype = c_otscreen
  3313. ELSE
  3314.    LOCATE FOR platform = g_screens[m.region, 7] AND objtype = c_otscreen
  3315. ENDIF
  3316. IF NOT FOUND()
  3317.    DO errorhandler WITH "Error in SCX: Objtype=1 not found",;
  3318.       LINENO(), c_error_3
  3319.    RETURN
  3320. ENDIF
  3321. IF NOT EMPTY(VALID) AND validtype<>0
  3322.    IF NOT m.g_multread
  3323.       m.name  = basename(DBF())
  3324.       DO gencomment WITH "Valid Code from screen: "+m.name
  3325.    ENDIF
  3326.    \#REGION <<INT(m.region)>>
  3327.    DO writecode WITH VALID, getplatname(m.region), c_fromone, c_untilend, m.region
  3328. ENDIF
  3329. RETURN
  3330.  
  3331. *!*****************************************************************************
  3332. *!
  3333. *!      Procedure: WHENCLAUSE
  3334. *!
  3335. *!      Called by: GENCLAUSECODE      (procedure in GENSCRN.PRG)
  3336. *!
  3337. *!          Calls: GENFUNCHEADER      (procedure in GENSCRN.PRG)
  3338. *!               : GENWHENBODY        (procedure in GENSCRN.PRG)
  3339. *!
  3340. *!*****************************************************************************
  3341. PROCEDURE whenclause
  3342. *)
  3343. *) WHENCLAUSE - Generate Read level When clause function.
  3344. *)
  3345. *) Description:
  3346. *) Generate the function containing the code segment(s) provided
  3347. *) by the user for the read level WHEN clause.
  3348. *) If multiple reads have been chosen, then this procedure generates
  3349. *) a function for a single screen (i.e., the one it has been called for).
  3350. *) If single read has been chosen and there are multiple screens,
  3351. *) we will concatenate when clause code segments from all screens
  3352. *) to form a single function.
  3353. *)
  3354. PARAMETER m.screenno
  3355. PRIVATE m.i, m.dbalias, m.thispretext
  3356.  
  3357. IF m.g_whentype = "EXPR" OR EMPTY(m.g_whentype)
  3358.    RETURN
  3359. ENDIF
  3360. DO genfuncheader WITH m.g_whenname, "Read Level When", .T.
  3361. \FUNCTION <<m.g_whenname>>     && Read Level When
  3362.  
  3363. m.thispretext = _PRETEXT
  3364. _PRETEXT = ""
  3365. IF m.g_multreads
  3366.    DO genwhenbody WITH m.screenno
  3367. ELSE
  3368.    FOR m.i = 1 TO m.g_nscreens
  3369.       m.g_screen = m.i
  3370.       m.dbalias = g_screens[m.i,5]
  3371.       SELECT (m.dbalias)
  3372.       DO genwhenbody WITH m.i
  3373.    ENDFOR
  3374.    m.g_screen = 0
  3375. ENDIF
  3376. _PRETEXT = m.thispretext
  3377. RETURN
  3378.  
  3379. *!*****************************************************************************
  3380. *!
  3381. *!      Procedure: GENWHENBODY
  3382. *!
  3383. *!      Called by: WHENCLAUSE         (procedure in GENSCRN.PRG)
  3384. *!
  3385. *!          Calls: ERRORHANDLER       (procedure in GENSCRN.PRG)
  3386. *!               : BASENAME()         (function  in GENSCRN.PRG)
  3387. *!               : GENCOMMENT         (procedure in GENSCRN.PRG)
  3388. *!               : GETPLATNAME()      (function  in GENSCRN.PRG)
  3389. *!               : WRITECODE          (procedure in GENSCRN.PRG)
  3390. *!
  3391. *!*****************************************************************************
  3392. PROCEDURE genwhenbody
  3393. *)
  3394. *) GENWHENBODY - Put out contents of when memo field.
  3395. *)
  3396. PARAMETER m.region
  3397. PRIVATE m.name, m.pos
  3398.  
  3399. IF g_screens[m.region, 6]
  3400.    LOCATE FOR objtype = c_otscreen
  3401. ELSE
  3402.    LOCATE FOR platform = g_screens[m.region, 7] AND objtype = c_otscreen
  3403. ENDIF
  3404. IF NOT FOUND()
  3405.    DO errorhandler WITH "Error in SCX: Objtype=1 not found",;
  3406.       LINENO(), c_error_3
  3407.    RETURN
  3408. ENDIF
  3409.  
  3410. IF NOT EMPTY(WHEN) AND whentype<>0
  3411.    IF NOT m.g_multread
  3412.       m.name = basename(DBF())
  3413.       DO gencomment WITH "When Code from screen: "+m.name
  3414.    ENDIF
  3415.    \#REGION <<INT(m.region)>>
  3416.    DO writecode WITH WHEN, getplatname(m.region), c_fromone, c_untilend, m.region
  3417. ENDIF
  3418. RETURN
  3419.  
  3420. *!*****************************************************************************
  3421. *!
  3422. *!      Procedure: ACTICLAUSE
  3423. *!
  3424. *!      Called by: GENCLAUSECODE      (procedure in GENSCRN.PRG)
  3425. *!
  3426. *!          Calls: GENFUNCHEADER      (procedure in GENSCRN.PRG)
  3427. *!               : GETPLATNAME()      (function  in GENSCRN.PRG)
  3428. *!               : WRITECODE          (procedure in GENSCRN.PRG)
  3429. *!               : ERRORHANDLER       (procedure in GENSCRN.PRG)
  3430. *!               : BASENAME()         (function  in GENSCRN.PRG)
  3431. *!               : GENCOMMENT         (procedure in GENSCRN.PRG)
  3432. *!
  3433. *!*****************************************************************************
  3434. PROCEDURE acticlause
  3435. *)
  3436. *) ACTICLAUSE - Generate Read level Activate clause function.
  3437. *)
  3438. *) Description:
  3439. *) Generate the function containing the code segment(s) provided
  3440. *) by the user for the read level ACTIVATE clause.
  3441. *) If multiple reads have been chosen, then this procedure generates
  3442. *) a function for a single screen (i.e., the one it has been called for).
  3443. *) If single read has been chosen and there are multiple screens,
  3444. *) we will concatenate activate clause code segments from all screens
  3445. *) to form a single function.  Each individual screen's code
  3446. *) segment will be enclosed in "IF WOUTPUT('windowname')" statement.
  3447. *) Desk top will be represented by a null character. The above
  3448. *) mentioned is performed by the procedure genactibody.
  3449. *)
  3450. PARAMETER m.screenno
  3451. PRIVATE m.i, m.name
  3452.  
  3453. IF m.g_actitype = "EXPR" OR EMPTY(m.g_actitype)
  3454.    RETURN
  3455. ENDIF
  3456. DO genfuncheader WITH m.g_actiname, "Read Level Activate", .T.
  3457. \FUNCTION <<m.g_actiname>>     && Read Level Activate
  3458.  
  3459. IF m.g_multreads
  3460.    IF NOT EMPTY(ACTIVATE) AND activtype<>0
  3461.       \#REGION <<INT(m.screenno)>>
  3462.       DO writecode WITH ACTIVATE, getplatname(m.screenno), c_fromone, c_untilend, m.screenno
  3463.    ENDIF
  3464. ELSE
  3465.    FOR m.i = 1 TO m.g_nscreens
  3466.       m.g_screen = m.i
  3467.       m.dbalias = g_screens[m.i,5]
  3468.       SELECT (m.dbalias)
  3469.       IF g_screens[m.i, 6]
  3470.          LOCATE FOR objtype = c_otscreen
  3471.       ELSE
  3472.          LOCATE FOR platform = g_screens[m.i, 7] AND objtype = c_otscreen
  3473.       ENDIF
  3474.       IF NOT FOUND()
  3475.          DO errorhandler WITH "Error in SCX: Objtype=1 not found",;
  3476.             LINENO(), c_error_3
  3477.          RETURN
  3478.       ENDIF
  3479.       IF NOT EMPTY(ACTIVATE) AND activtype<>0
  3480.          m.name = basename(g_screens[m.i,1])
  3481.          DO gencomment WITH "Activate Code from screen: "+;
  3482.             m.name
  3483.       ENDIF
  3484.       IF NOT EMPTY(ACTIVATE) AND activtype<>0
  3485.          \#REGION <<INT(m.i)>>
  3486.          DO writecode WITH ACTIVATE, getplatname(m.i), c_fromone, c_untilend, m.i
  3487.       ENDIF
  3488.    ENDFOR
  3489.    m.g_screen = 0
  3490. ENDIF
  3491. RETURN
  3492.  
  3493. *!*****************************************************************************
  3494. *!
  3495. *!      Procedure: DEATCLAUSE
  3496. *!
  3497. *!      Called by: GENCLAUSECODE      (procedure in GENSCRN.PRG)
  3498. *!
  3499. *!          Calls: GENFUNCHEADER      (procedure in GENSCRN.PRG)
  3500. *!               : GETPLATNAME()      (function  in GENSCRN.PRG)
  3501. *!               : WRITECODE          (procedure in GENSCRN.PRG)
  3502. *!               : ERRORHANDLER       (procedure in GENSCRN.PRG)
  3503. *!               : BASENAME()         (function  in GENSCRN.PRG)
  3504. *!               : GENCOMMENT         (procedure in GENSCRN.PRG)
  3505. *!
  3506. *!*****************************************************************************
  3507. PROCEDURE deatclause
  3508. *)
  3509. *) DEATCLAUSE - Generate Read level deactivate clause function.
  3510. *)
  3511. *) Description:
  3512. *) Generate the function containing the code segment(s) provided
  3513. *) by the user for the read level DEACTIVATE clause.
  3514. *) If multiple reads have been chosen, then this procedure generates
  3515. *) a function for a single screen (i.e., the one it has been called for).
  3516. *) If single read has been chosen and there are multiple screens,
  3517. *) we will concatenate deactivate clause code segments from all screens
  3518. *) to form a single function.  Each individual screen's code
  3519. *) segment will be enclosed in "IF WOUTPUT('windowname')" statement.
  3520. *) Desk top will be represented by a null character. The above
  3521. *) mentioned is performed by the procedure gendeatbody.
  3522. *)
  3523. PARAMETER m.screenno
  3524. PRIVATE m.i, m.name
  3525.  
  3526. IF m.g_deattype = "EXPR" OR EMPTY(m.g_deattype)
  3527.    RETURN
  3528. ENDIF
  3529. DO genfuncheader WITH m.g_deatname, "Read Level Deactivate", .T.
  3530. \FUNCTION <<m.g_deatname>>     && Read Level Deactivate
  3531.  
  3532. IF m.g_multreads
  3533.    IF NOT EMPTY(DEACTIVATE) AND deacttype<>0
  3534.       \#REGION <<INT(m.screenno)>>
  3535.       DO writecode WITH DEACTIVATE, getplatname(m.screenno), c_fromone, c_untilend, m.screenno
  3536.    ENDIF
  3537. ELSE
  3538.    FOR m.i = 1 TO m.g_nscreens
  3539.       m.g_screen = m.i
  3540.       m.dbalias = g_screens[m.i,5]
  3541.       SELECT (m.dbalias)
  3542.       IF g_screens[m.i,6]
  3543.          LOCATE FOR objtype = c_otscreen
  3544.       ELSE
  3545.          LOCATE FOR platform = g_screens[m.i, 7] AND objtype = c_otscreen
  3546.       ENDIF
  3547.       IF NOT FOUND()
  3548.          DO errorhandler WITH "Error in SCX: Objtype=1 not found",;
  3549.             LINENO(), c_error_3
  3550.          RETURN
  3551.       ENDIF
  3552.       IF NOT EMPTY(DEACTIVATE) AND deacttype<>0
  3553.          m.name = basename(g_screens[m.i,1])
  3554.          DO gencomment WITH "Deactivate Code from screen: "+;
  3555.             m.name
  3556.       ENDIF
  3557.       IF NOT EMPTY(DEACTIVATE) AND deacttype<>0
  3558.          \#REGION <<INT(m.i)>>
  3559.          DO writecode WITH DEACTIVATE, getplatname(m.i), c_fromone, c_untilend, m.i
  3560.       ENDIF
  3561.    ENDFOR
  3562.    m.g_screen = 0
  3563. ENDIF
  3564. RETURN
  3565.  
  3566. *!*****************************************************************************
  3567. *!
  3568. *!      Procedure: SHOWCLAUSE
  3569. *!
  3570. *!      Called by: GENCLAUSECODE      (procedure in GENSCRN.PRG)
  3571. *!
  3572. *!          Calls: GENFUNCHEADER      (procedure in GENSCRN.PRG)
  3573. *!               : ERRORHANDLER       (procedure in GENSCRN.PRG)
  3574. *!               : GETPLATNAME()      (function  in GENSCRN.PRG)
  3575. *!               : WRITECODE          (procedure in GENSCRN.PRG)
  3576. *!               : PLACESAYS          (procedure in GENSCRN.PRG)
  3577. *!               : BASENAME()         (function  in GENSCRN.PRG)
  3578. *!               : GENCOMMENT         (procedure in GENSCRN.PRG)
  3579. *!
  3580. *!*****************************************************************************
  3581. PROCEDURE showclause
  3582. *)
  3583. *) SHOWCLAUSE - Generate Read level Show clause procedure.
  3584. *)
  3585. *) Description:
  3586. *) Generate the function containing the code segment(s) provided
  3587. *) by the user for the read level SHOW clause.  The function generated
  3588. *) for the show clause will consist of refreshable @...SAY code and
  3589. *) code segment(s) if applicable. If multiple reads have been chosen,
  3590. *) then this procedure generates a function for a single screen
  3591. *) (i.e., the one it has been called for).  If single read has been
  3592. *) chosen and there are multiple screens, we will concatenate show
  3593. *) clause code segments from all screens to form a single function.
  3594. *) Each individual screen's refreshable SAYs will be enclosed in
  3595. *) "IF SYS(2016)=('windowname') OR SYS(2016) = '*'" statement.
  3596. *) (Desk top will be represented by a null character.)
  3597. *)
  3598. PARAMETER m.screenno
  3599. PRIVATE m.i, m.comment, m.name, m.thispretext, m.oldshow, m.showmod
  3600.  
  3601. IF m.g_showtype = "EXPR" OR EMPTY(m.g_showtype)
  3602.    RETURN
  3603. ENDIF
  3604. DO genfuncheader WITH m.g_showname, "Read Level Show", .T.
  3605.  
  3606. \FUNCTION <<m.g_showname>>     && Read Level Show
  3607. \PRIVATE currwind
  3608.  
  3609. \STORE WOUTPUT() TO currwind
  3610. m.thispretext = _PRETEXT
  3611. _PRETEXT = ""
  3612.  
  3613. IF m.g_multreads
  3614.    DO seekheader WITH m.screenno
  3615.    m.oldshow = Show
  3616.  
  3617.    m.showmod = ChkShow()
  3618.  
  3619.    m.comment = .T.
  3620.    \#REGION <<INT(m.screenno)>>
  3621.    IF NOT EMPTY(show) AND showtype<>0
  3622.       DO writecode WITH show, getplatname(m.screenno), c_fromone, c_untilend, m.screenno
  3623.    ENDIF
  3624.    DO placesays WITH m.comment, m.g_showname, m.screenno
  3625.    IF m.showmod
  3626.       REPLACE show WITH m.oldshow
  3627.    ENDIF
  3628. ELSE
  3629.    FOR m.i = 1 TO m.g_nscreens
  3630.       m.g_screen = m.i
  3631.       m.dbalias = g_screens[m.i,5]
  3632.       SELECT (m.dbalias)
  3633.       m.comment = .F.
  3634.  
  3635.       DO seekheader WITH m.i
  3636.  
  3637.       m.name = basename(g_screens[m.i,1])
  3638.       IF NOT EMPTY(show) AND showtype<>0
  3639.          m.oldshow = Show   && record show snippet
  3640.          m.showmod = ChkShow()         && may modify show snippet directly
  3641.  
  3642.          DO gencomment WITH "Show Code from screen: "+m.name
  3643.          \#REGION <<INT(m.i)>>
  3644.          m.comment = .T.
  3645.          DO writecode WITH show, getplatname(m.i), c_fromone, c_untilend, m.i
  3646.          IF m.showmod
  3647.             REPLACE show WITH m.oldshow
  3648.          ENDIF
  3649.       ENDIF
  3650.       DO seekheader WITH m.i
  3651.       DO placesays WITH m.comment, m.name, m.i
  3652.    ENDFOR
  3653.    m.g_screen = 0
  3654. ENDIF
  3655. _PRETEXT = m.thispretext
  3656.  
  3657. IF !m.g_noreadplain
  3658.    \IF NOT EMPTY(currwind)
  3659.    \    ACTIVATE WINDOW (currwind) SAME
  3660.    \ENDIF
  3661. ENDIF
  3662. RETURN
  3663.  
  3664. *!*****************************************************************************
  3665. *!
  3666. *!      Function: CHKSHOW
  3667. *!
  3668. *!*****************************************************************************
  3669. FUNCTION chkshow
  3670. PRIVATE m.thelineno, m.theline, m.oldmline, m.upline, m.newshow, m.found_one, m.leadspace, ;
  3671.    m.oldtext, m.theword, m.getsonly, m.j
  3672. * Check for a poisonous SHOW GETS in the SHOW snippet.  If one if executed
  3673. * there, runaway recursion results.
  3674. IF c_checkshow == 0   && check to see if this safety feature is enabled.
  3675.    RETURN .F.
  3676. ENDIF
  3677. m.thelineno = ATCLINE("SHOW GETS",show)
  3678. m.oldmline = _MLINE
  3679. m.oldtext = _TEXT
  3680. m.found_one = .F.
  3681. IF m.thelineno > 0
  3682.    * Step through the SHOW snippet a line at a time, commenting out any SHOW GETS or
  3683.    * SHOW GETS OFF statements.
  3684.    m.newshow = ""
  3685.    _MLINE = 0
  3686.    DO WHILE _MLINE < LEN(show)
  3687.       m.theline = MLINE(show,1,_MLINE)
  3688.       DO killcr WITH m.theline
  3689.       m.upline  = UPPER(LTRIM(m.theline))
  3690.       IF wordnum(m.upline,1) == "SHOW" AND wordnum(m.upline,2) == "GETS" ;
  3691.              AND (EMPTY(wordnum(m.upline,3)) OR wordnum(m.upline,3) == "OFF")
  3692.          m.leadspace = LEN(m.theline) - LEN(m.upline)
  3693.          m.newshow = m.newshow + SPACE(m.leadspace) + ;
  3694.             "* Commented out by GENSCRN: " + LTRIM(m.theline) + CHR(13) + CHR(10)
  3695.          DO errorhandler WITH "SHOW GETS statement commented out of SHOW snippet.",;
  3696.               LINENO(),c_error_1
  3697.          m.found_one = .T.
  3698.       ELSE
  3699.          m.newshow = m.newshow + m.theline + CHR(13) + CHR(10)
  3700.       ENDIF
  3701.    ENDDO
  3702.    IF m.found_one
  3703.       REPLACE show WITH m.newshow
  3704.    ENDIF
  3705. ENDIF
  3706. _MLINE = m.oldmline
  3707. _TEXT  = m.oldtext
  3708. RETURN m.found_one
  3709.  
  3710. *!*****************************************************************************
  3711. *!
  3712. *!      Procedure: PLACESAYS
  3713. *!
  3714. *!      Called by: SHOWCLAUSE         (procedure in GENSCRN.PRG)
  3715. *!
  3716. *!          Calls: GENCOMMENT         (procedure in GENSCRN.PRG)
  3717. *!               : GENPICTURE         (procedure in GENSCRN.PRG)
  3718. *!               : PUSHINDENT         (procedure in GENSCRN.PRG)
  3719. *!               : ANYFONT            (procedure in GENSCRN.PRG)
  3720. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  3721. *!               : ANYPICTURE         (procedure in GENSCRN.PRG)
  3722. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  3723. *!               : POPINDENT          (procedure in GENSCRN.PRG)
  3724. *!
  3725. *!*****************************************************************************
  3726. PROCEDURE placesays
  3727. *)
  3728. *) PLACESAYS - Generate @...SAY for refreshable says in the .PRG file.
  3729. *)
  3730. *) Description:
  3731. *) Place @...SAY code for all refreshable say statements into
  3732. *) the generated SHOW clause function.
  3733. *)
  3734. PARAMETER m.comment, m.scrnname, m.g_thisscreen
  3735. PRIVATE m.iswindow, m.sayfound, m.windowname, m.theexpr, m.occur, m.pos
  3736.  
  3737. IF EMPTY(STYLE)
  3738.    m.iswindow = .F.
  3739. ELSE
  3740.    m.iswindow = .T.
  3741.    m.windowname = g_screens[m.g_thisscreen,2]
  3742. ENDIF
  3743. m.sayfound = .T.
  3744. SCAN FOR ((objtype = c_otfield AND objcode = c_sgsay) OR ;
  3745.       (objtype = c_otpicture)) AND ;
  3746.       REFRESH = .T. AND (g_screens[m.g_thisscreen, 6] OR platform = g_screens[m.g_thisscreen, 7])
  3747.    IF m.sayfound
  3748.       IF NOT m.comment
  3749.          DO gencomment WITH "Show Code from screen: "+m.scrnname
  3750.          \#REGION <<INT(m.g_thisscreen)>>
  3751.       ENDIF
  3752.       IF !m.g_noreadplain    && not just emitting plain @ SAYs/GETs
  3753.          \IF SYS(2016) =
  3754.          IF m.iswindow
  3755.             \\ "<<UPPER(m.windowname)>>" OR SYS(2016) = "*"
  3756.             \    ACTIVATE WINDOW <<m.windowname>> SAME
  3757.          ELSE
  3758.             \\ "" OR SYS(2016) = "*"
  3759.             \    ACTIVATE SCREEN
  3760.          ENDIF
  3761.       ENDIF
  3762.       m.sayfound = .F.
  3763.    ENDIF
  3764.  
  3765.    IF objtype = c_otpicture
  3766.       DO genpicture
  3767.    ELSE
  3768.       m.theexpr = expr
  3769.       IF g_screens[m.g_thisscreen, 7] = 'WINDOWS' OR g_screens[m.g_thisscreen, 7] = 'MAC'
  3770.          SET DECIMALS TO 3
  3771.          m.occur = 1
  3772.          m.pos = AT(CHR(13), m.theexpr, m.occur)
  3773.  
  3774.          * Sometimes the screen builder surrounds text with single quotes and other
  3775.          * times with double quotes.
  3776.          q1 = LEFT(LTRIM(m.theexpr),1)
  3777.  
  3778.          DO WHILE m.pos > 0
  3779.             IF q1 = "'"
  3780.                m.theexpr = LEFT(m.theexpr, m.pos -1) + ;
  3781.                   "' + CHR(13) + ;" + CHR(13)  + CHR(9) + CHR(9) + "'" ;
  3782.                   + SUBSTR(m.theexpr, m.pos + 1)
  3783.             ELSE
  3784.                m.theexpr = LEFT(m.theexpr, m.pos -1) + ;
  3785.                   '" + CHR(13) + ;' + CHR(13)  + CHR(9) + CHR(9) + '"' ;
  3786.                   + SUBSTR(m.theexpr, m.pos + 1)
  3787.             ENDIF
  3788.             m.occur = m.occur + 1
  3789.             m.pos = AT(CHR(13), m.theexpr, m.occur)
  3790.          ENDDO
  3791.          IF mode = 1 AND objtype = c_otfield  AND objcode = c_sgsay    && transparent SAY text
  3792.             * Clear the space that the SAY is going into.  This makes refreshable SAYS
  3793.             * work with transparent fonts.
  3794.             \    @ <<Vpos>>,<<Hpos>> CLEAR TO <<Vpos+Height>>,<<Hpos+Width>>
  3795.          ENDIF
  3796.       ENDIF
  3797.       \    @ <<Vpos>>,<<Hpos>> SAY <<m.theexpr>> ;
  3798.       \        SIZE <<Height>>,<<Width>>, <<Spacing>>
  3799.       SET DECIMALS TO 0
  3800.       DO pushindent
  3801.       DO anyfont
  3802.       DO anystyle
  3803.       DO anypicture
  3804.       DO anyscheme
  3805.       DO popindent
  3806.    ENDIF
  3807. ENDSCAN
  3808. IF NOT m.sayfound
  3809.    \ENDIF
  3810. ENDIF
  3811. RETURN
  3812.  
  3813. *!*****************************************************************************
  3814. *!
  3815. *!      Procedure: GENCLOSEDBFS
  3816. *!
  3817. *!      Called by: GENCLNENVIRON      (procedure in GENSCRN.PRG)
  3818. *!
  3819. *!          Calls: COMMENTBLOCK       (procedure in GENSCRN.PRG)
  3820. *!               : UNIQUEDBF()        (function  in GENSCRN.PRG)
  3821. *!
  3822. *!*****************************************************************************
  3823. PROCEDURE genclosedbfs
  3824. *)
  3825. *) GENCLOSEDBFS - Generate code to close all previously opened databases.
  3826. *)
  3827. PRIVATE m.i, m.dbalias, m.dbfcnt, m.firstfound
  3828. m.firstfound = .T.
  3829. m.dbfcnt = 0
  3830. g_dbfs = ""
  3831. FOR m.i = 1 TO m.g_nscreens
  3832.    m.g_screen = m.i
  3833.    m.dbalias = g_screens[m.i,5]
  3834.    SELECT (m.dbalias)
  3835.    SCAN FOR objtype = c_otworkarea AND (g_screens[m.i, 6] OR platform = g_screens[m.i, 7])
  3836.       IF m.firstfound
  3837.          DO commentblock WITH ""," Closing Databases"
  3838.          m.firstfound = .F.
  3839.       ENDIF
  3840.       IF uniquedbf(TAG)
  3841.          m.dbfcnt = m.dbfcnt + 1
  3842.          DIMENSION g_dbfs[m.dbfcnt]
  3843.          g_dbfs[m.dbfcnt] = TAG
  3844.       ELSE
  3845.          LOOP
  3846.       ENDIF
  3847.       \IF USED("<<LOWER(stripext(strippath(Tag)))>>")
  3848.       \    SELECT <<LOWER(stripext(strippath(Tag)))>>
  3849.       \    USE
  3850.       \ENDIF
  3851.       \
  3852.    ENDSCAN
  3853. ENDFOR
  3854. m.g_screen = 0
  3855. IF m.g_closefiles
  3856.    \SELECT (m.currarea)
  3857.    \
  3858. ENDIF
  3859. DIMENSION g_dbfs[1]
  3860. RETURN
  3861.  
  3862. *!*****************************************************************************
  3863. *!
  3864. *!      Procedure: GENOPENDBFS
  3865. *!
  3866. *!      Called by: BUILDCTRL          (procedure in GENSCRN.PRG)
  3867. *!
  3868. *!          Calls: COMMENTBLOCK       (procedure in GENSCRN.PRG)
  3869. *!               : UNIQUEDBF()        (function  in GENSCRN.PRG)
  3870. *!               : GENUSESTMTS        (procedure in GENSCRN.PRG)
  3871. *!               : STRIPPATH()        (function  in GENSCRN.PRG)
  3872. *!               : ERRORHANDLER       (procedure in GENSCRN.PRG)
  3873. *!               : GENRELATIONS       (procedure in GENSCRN.PRG)
  3874. *!
  3875. *!*****************************************************************************
  3876. PROCEDURE genopendbfs
  3877. *)
  3878. *) GENOPENDBFS - Generate USE... statement(s).
  3879. *)
  3880. *) Description:
  3881. *) Generate code to open databases, set indexes, and relations as
  3882. *) specified by the user.
  3883. *)
  3884. PRIVATE m.dbalias, m.i, m.dbfcnt, m.string, m.msg, m.firstfound
  3885. m.firstfound = .T.
  3886. FOR m.i = 1 TO m.g_nscreens
  3887.    m.g_screen = m.i
  3888.    m.dbalias = g_screens[m.i,5]
  3889.    SELECT (m.dbalias)
  3890.    m.dbfcnt = 0
  3891.    SCAN FOR objtype = c_otworkarea AND (g_screens[m.i, 6] OR platform = g_screens[m.i, 7])
  3892.       IF m.firstfound
  3893.          DO commentblock WITH m.dbalias, ;
  3894.             " Databases, Indexes, Relations"
  3895.          m.firstfound = .F.
  3896.       ENDIF
  3897.       IF uniquedbf(TAG)
  3898.          m.dbfcnt = m.dbfcnt + 1
  3899.          DIMENSION g_dbfs[m.dbfcnt]
  3900.          g_dbfs[m.dbfcnt] = TAG
  3901.       ELSE
  3902.          LOOP
  3903.       ENDIF
  3904.       DO genusestmts WITH m.i
  3905.    ENDSCAN
  3906.  
  3907.    IF m.dbfcnt > 1
  3908.       IF NOT EMPTY(m.g_current)
  3909.          \SELECT <<m.g_current>>
  3910.       ELSE
  3911.          m.msg = "Please RE-SAVE screen environment... SCREEN: "+;
  3912.             strippath(g_screens[m.i,1])
  3913.          DO errorhandler WITH m.msg, LINENO(), c_error_1
  3914.       ENDIF
  3915.       \
  3916.    ENDIF
  3917. ENDFOR
  3918. m.g_screen = 0
  3919. DO genrelations
  3920. RETURN
  3921.  
  3922. *!*****************************************************************************
  3923. *!
  3924. *!       Function: UNIQUEDBF
  3925. *!
  3926. *!      Called by: GENCLOSEDBFS       (procedure in GENSCRN.PRG)
  3927. *!               : GENOPENDBFS        (procedure in GENSCRN.PRG)
  3928. *!
  3929. *!*****************************************************************************
  3930. FUNCTION uniquedbf
  3931. *)
  3932. *) UNIQUEDBF - Check if database name already seen.
  3933. *)
  3934. PARAMETER m.dbfname
  3935. RETURN IIF(ASCAN(g_dbfs, m.dbfname)=0,.T.,.F.)
  3936.  
  3937. *!*****************************************************************************
  3938. *!
  3939. *!      Procedure: GENUSESTMTS
  3940. *!
  3941. *!      Called by: GENOPENDBFS        (procedure in GENSCRN.PRG)
  3942. *!
  3943. *!          Calls: FINDRELPATH()      (function  in GENSCRN.PRG)
  3944. *!               : GENORDER           (procedure in GENSCRN.PRG)
  3945. *!               : GENINDEXES()       (function  in GENSCRN.PRG)
  3946. *!
  3947. *!*****************************************************************************
  3948. PROCEDURE genusestmts
  3949. *)
  3950. *) GENUSESTMTS - Generate USE... statements
  3951. *)
  3952. *) Description:
  3953. *) Generate USE... statements for each database encoded in the
  3954. *) screen database.  Generate ORDER statement if appropriate.
  3955. *)
  3956. PARAMETER m.i
  3957. PRIVATE m.workarea, saverecno, MARGIN, m.name, m.order, m.tag
  3958. m.workarea  = objcode
  3959. saverecno = RECNO()
  3960. m.order   = LOWER(ALLTRIM(ORDER))
  3961. m.tag     = LOWER(ALLTRIM(tag2))
  3962. m.name    = LOWER(TAG)
  3963. m.relpath = LOWER(findrelpath(name))
  3964.  
  3965. IF UNIQUE AND EMPTY(m.g_current)
  3966.    m.g_current = m.name
  3967. ENDIF
  3968.  
  3969. MARGIN = 4
  3970. IF EMPTY(name)
  3971.    \SELECT <<m.name>>
  3972.    RETURN
  3973. ENDIF
  3974. \IF USED("<<m.name>>")
  3975. \    SELECT <<m.name>>
  3976. IF genindexes ("select", m.i)=0
  3977.    indexfound = 0
  3978.    \    SET ORDER TO
  3979.    DO genorder WITH indexfound,m.order,m.tag,m.name
  3980. ELSE
  3981.    indexfound = 1
  3982.    \\ ADDITIVE ;
  3983.    \        ORDER
  3984.    DO genorder WITH indexfound,m.order,m.tag,m.name
  3985. ENDIF
  3986.  
  3987. \ELSE
  3988. \    SELECT 0
  3989. \    USE (LOCFILE("<<m.relpath>>","DBF",
  3990. \\"Where is <<basename(m.relpath)>>?"));
  3991. \        AGAIN ALIAS <<m.name>>
  3992. MARGIN = 42+LEN(m.relpath)+2*LEN(m.name)
  3993. = genindexes("use", m.i)
  3994.  
  3995. GOTO saverecno
  3996. \\ ;
  3997. \        ORDER
  3998. DO genorder WITH indexfound,m.order,m.tag,m.name
  3999. \ENDIF
  4000. \
  4001. RETURN
  4002.  
  4003. *!*****************************************************************************
  4004. *!
  4005. *!       Function: FINDRELPATH
  4006. *!
  4007. *!      Called by: GENUSESTMTS        (procedure in GENSCRN.PRG)
  4008. *!               : GENINDEXES()       (function  in GENSCRN.PRG)
  4009. *!               : GENPICTURE         (procedure in GENSCRN.PRG)
  4010. *!               : ANYBITMAPCTRL      (procedure in GENSCRN.PRG)
  4011. *!               : ANYWALLPAPER       (procedure in GENSCRN.PRG)
  4012. *!               : ANYICON            (procedure in GENSCRN.PRG)
  4013. *!
  4014. *!*****************************************************************************
  4015. FUNCTION findrelpath
  4016. *)
  4017. *) FINDRELPATH - Find relative path for DATABASES.
  4018. *)
  4019. PARAMETER m.name
  4020. PRIVATE m.fullpath, m.relpath
  4021. m.fullpath = UPPER(FULLPATH(m.name, g_screens[1,1]))
  4022. m.relpath  = SYS(2014, m.fullpath, UPPER(m.g_homedir))
  4023. RETURN m.relpath
  4024.  
  4025. *!*****************************************************************************
  4026. *!
  4027. *!      Procedure: GENORDER
  4028. *!
  4029. *!      Called by: GENUSESTMTS        (procedure in GENSCRN.PRG)
  4030. *!
  4031. *!*****************************************************************************
  4032. PROCEDURE genorder
  4033. *)
  4034. *) GENORDER - Generate ORDER clause.
  4035. *)
  4036. PARAMETER m.indexfound, m.order, m.tag, m.dbfname
  4037. IF EMPTY(m.order) AND EMPTY(m.tag)
  4038.    \\ 0
  4039.    RETURN
  4040. ENDIF
  4041. IF m.indexfound=0
  4042.    \\ TAG "<<m.tag>>"
  4043. ELSE
  4044.    IF EMPTY(m.tag)
  4045.       \\ <<basename(m.order)>>
  4046.    ELSE
  4047.       \\ TAG "<<m.tag>>"
  4048.       IF NOT EMPTY (m.order)
  4049.          \\ OF <<m.order>>
  4050.       ENDIF
  4051.    ENDIF
  4052. ENDIF
  4053. RETURN
  4054.  
  4055. *!*****************************************************************************
  4056. *!
  4057. *!       Function: GENINDEXES
  4058. *!
  4059. *!      Called by: GENUSESTMTS        (procedure in GENSCRN.PRG)
  4060. *!
  4061. *!          Calls: FINDRELPATH()      (function  in GENSCRN.PRG)
  4062. *!
  4063. *!*****************************************************************************
  4064. FUNCTION genindexes
  4065. *)
  4066. *) GENINDEXES - Generate index names for a USE statement.
  4067. *)
  4068. PARAMETER m.placement, m.i
  4069. PRIVATE m.idxcount, m.relpath
  4070. m.idxcount = 0
  4071.  
  4072. SCAN FOR objtype = c_otindex AND objcode = WORKAREA AND;
  4073.       (g_screens[m.i, 6] OR platform = g_screens[m.i, 7])
  4074.    m.relpath = LOWER(findrelpath(name))
  4075.    IF m.idxcount > 0
  4076.       IF MARGIN > 55
  4077.          MARGIN = 8 + LEN(m.relpath)
  4078.          \\, ;
  4079.          \        <<m.relpath>>
  4080.       ELSE
  4081.          \\, <<m.relpath>>
  4082.          MARGIN = MARGIN + 2 + LEN(m.relpath)
  4083.       ENDIF
  4084.    ELSE
  4085.       IF m.placement = "use"
  4086.          \\ ;
  4087.          \        INDEX <<m.relpath>>
  4088.          MARGIN = 8 + LEN(m.relpath)
  4089.       ELSE
  4090.          \    SET INDEX TO <<m.relpath>>
  4091.          MARGIN = 17
  4092.          MARGIN = MARGIN + LEN(m.relpath)
  4093.       ENDIF
  4094.    ENDIF
  4095.    m.idxcount = m.idxcount + 1
  4096. ENDSCAN
  4097. RETURN m.idxcount
  4098.  
  4099. *!*****************************************************************************
  4100. *!
  4101. *!      Procedure: GENRELATIONS
  4102. *!
  4103. *!      Called by: GENOPENDBFS        (procedure in GENSCRN.PRG)
  4104. *!
  4105. *!          Calls: SEEKHEADER         (procedure in GENSCRN.PRG)
  4106. *!               : GENRELSTMTS        (procedure in GENSCRN.PRG)
  4107. *!
  4108. *!*****************************************************************************
  4109. PROCEDURE genrelations
  4110. *)
  4111. *) GENRELATIONS - Generate code to set all existing relations as they
  4112. *)                 are encoded in the screen file(s).
  4113. *)
  4114. *) Description:
  4115. *) Generate code for all relations as encoded in the screen database.
  4116. *)
  4117. PRIVATE m.dbalias, m.i
  4118. FOR m.i = 1 TO m.g_nscreens
  4119.    m.g_screen = m.i
  4120.    m.dbalias  = g_screens[m.i,5]
  4121.    SELECT (m.dbalias)
  4122.  
  4123.    DO seekheader WITH m.i
  4124.    DO genrelstmts WITH m.i
  4125. ENDFOR
  4126. m.g_screen = 0
  4127. RETURN
  4128.  
  4129. *!*****************************************************************************
  4130. *!
  4131. *!      Procedure: GENRELSTMTS
  4132. *!
  4133. *!      Called by: GENRELATIONS       (procedure in GENSCRN.PRG)
  4134. *!
  4135. *!          Calls: BASENAME()         (function  in GENSCRN.PRG)
  4136. *!
  4137. *!*****************************************************************************
  4138. PROCEDURE genrelstmts
  4139. *)
  4140. *) GENRELSTMTS - Generate relation statements.
  4141. *)
  4142. PARAMETER m.i
  4143. PRIVATE m.saverec, m.last, m.firstrel, m.firstsel, m.dbalias, m.setskip
  4144. m.dbalias  = ""
  4145. m.firstrel = .T.
  4146. m.firstsel = .T.
  4147. m.last     = 0
  4148. m.setskip  = ""
  4149.  
  4150. SCAN FOR objtype = c_otrel AND ;
  4151.       (g_screens[m.i, 6] OR platform = g_screens[m.i, 7])
  4152.    IF m.last<> objcode
  4153.       IF NOT (m.firstrel OR EMPTY(m.setskip))
  4154.          \SET SKIP TO <<m.setskip>>
  4155.          \
  4156.       ENDIF
  4157.       m.saverec = RECNO()
  4158.       m.last= objcode
  4159.  
  4160.       SCAN FOR objtype = c_otworkarea AND objcode = m.last AND ;
  4161.             (g_screens[m.i, 6] OR platform = g_screens[m.i, 7])
  4162.          m.dbalias = LOWER(basename(TAG))
  4163.          IF NOT (m.firstrel AND m.g_current = m.dbalias)
  4164.             \SELECT <<m.dbalias>>
  4165.          ENDIF
  4166.          m.setskip = ALLTRIM(LOWER(expr))
  4167.       ENDSCAN
  4168.  
  4169.       GOTO RECORD m.saverec
  4170.       m.firstrel = .F.
  4171.    ENDIF
  4172.  
  4173.    IF !(m.firstsel AND LOWER(tag2) == LOWER(m.g_current))
  4174.       \SELECT <<LOWER(Tag2)>>
  4175.       \
  4176.    ENDIF
  4177.    \SET RELATION OFF INTO <<LOWER(Tag)>>
  4178.    \SET RELATION TO <<LOWER(Expr)>> INTO <<LOWER(Tag)>> ADDITIVE
  4179.    \
  4180.  
  4181.    m.firstsel = .F.
  4182. ENDSCAN
  4183.  
  4184. IF m.last<> 0
  4185.    IF NOT EMPTY(m.setskip)
  4186.       \SET SKIP TO <<m.setskip>>
  4187.       \
  4188.    ENDIF
  4189.    IF NOT EMPTY(m.g_current)
  4190.       \SELECT <<m.g_current>>
  4191.    ENDIF
  4192. ENDIF
  4193. RETURN
  4194.  
  4195. **
  4196. ** Code Associated With Building of the Format file statements.
  4197. **
  4198.  
  4199. *!*****************************************************************************
  4200. *!
  4201. *!      Procedure: BUILDFMT
  4202. *!
  4203. *!      Called by: BUILDCTRL          (procedure in GENSCRN.PRG)
  4204. *!
  4205. *!          Calls: MULTIPLAT()        (function  in GENSCRN.PRG)
  4206. *!               : VERSIONCAP()       (function  in GENSCRN.PRG)
  4207. *!               : PUTMSG             (procedure in GENSCRN.PRG)
  4208. *!               : SEEKHEADER         (procedure in GENSCRN.PRG)
  4209. *!               : COMMENTBLOCK       (procedure in GENSCRN.PRG)
  4210. *!               : GENDIRECTIVE       (procedure in GENSCRN.PRG)
  4211. *!               : UPDTHERM           (procedure in GENSCRN.PRG)
  4212. *!               : ANYWINDOWS         (procedure in GENSCRN.PRG)
  4213. *!               : GENTEXT            (procedure in GENSCRN.PRG)
  4214. *!               : GENFIELDS          (procedure in GENSCRN.PRG)
  4215. *!               : GENBOXES           (procedure in GENSCRN.PRG)
  4216. *!               : GENLINES           (procedure in GENSCRN.PRG)
  4217. *!               : GENPUSH            (procedure in GENSCRN.PRG)
  4218. *!               : GENRADBUT          (procedure in GENSCRN.PRG)
  4219. *!               : GENINVBUT          (procedure in GENSCRN.PRG)
  4220. *!               : GENPOPUP           (procedure in GENSCRN.PRG)
  4221. *!               : GENCHKBOX          (procedure in GENSCRN.PRG)
  4222. *!               : GENLIST            (procedure in GENSCRN.PRG)
  4223. *!               : GENPICTURE         (procedure in GENSCRN.PRG)
  4224. *!               : GENSPINNER         (procedure in GENSCRN.PRG)
  4225. *!               : GENACTISTMTS       (procedure in GENSCRN.PRG)
  4226. *!               : PLACEREAD          (procedure in GENSCRN.PRG)
  4227. *!
  4228. *!*****************************************************************************
  4229. PROCEDURE buildfmt
  4230. *)
  4231. *) BUILDFMT - Build Format file statements.
  4232. *)
  4233. *) Description:
  4234. *) Generate all boxes, text, fields, push buttons, radio buttons,
  4235. *) popups, check boxes and scrollable lists encoded in a screen set.
  4236. *)
  4237. PARAMETER pnum   && platform number
  4238. PRIVATE m.pos, m.dbalias, m.adjuster, m.recadjust, m.increment, m.i, m.sn
  4239. m.msg = 'Generating Screen Code'
  4240. IF multiplat()
  4241.    m.msg = m.msg + " for "+versioncap(m.g_genvers, m.g_dualoutput)
  4242. ENDIF
  4243. DO putmsg WITH m.msg
  4244. m.g_nwindows = 0
  4245. m.adjuster   = INT((c_therm4-c_therm3)/m.g_nscreens)  && total therm. range to cover
  4246. m.recadjust  = c_therm3                 && starting position for thermometer
  4247. FOR m.sn = 1 TO m.g_nscreens
  4248.    m.g_screen = m.sn
  4249.    m.dbalias = g_screens[m.sn,5]
  4250.    SELECT (m.dbalias)
  4251.    DO seekheader WITH m.sn
  4252.  
  4253.    DO commentblock WITH g_screens[m.sn,1], " Screen Layout"
  4254.    \#REGION <<INT(m.sn)>>
  4255.    IF ATC('#ITSE',setupcode)<>0
  4256.       DO gendirective WITH ;
  4257.          MLINE(setupcode,ATCLINE('#ITSE',setupcode)),;
  4258.          '#ITSE'
  4259.    ENDIF
  4260.  
  4261.    * Figure out thermometer increment
  4262.    IF g_screens[m.sn, 6] OR m.g_numplatforms = 1
  4263.       m.recs = RECCOUNT()
  4264.    ELSE
  4265.       GOTO TOP
  4266.       COUNT FOR platform = g_screens[m.sn, 7] TO m.recs
  4267.    ENDIF
  4268.    m.increment = m.adjuster/m.recs
  4269.  
  4270.    SCAN FOR (g_screens[m.sn, 6] OR platform = g_screens[m.sn, 7])
  4271.       m.recadjust = m.recadjust + m.increment
  4272.  
  4273.     DO updtherm WITH thermadj(m.pnum,INT(m.recadjust),c_therm5)
  4274.  
  4275.       DO genusercode WITH c_premode
  4276.  
  4277.       DO CASE
  4278.       CASE objtype = c_otscreen
  4279.          DO anywindows WITH (m.sn)
  4280.       CASE objtype = c_ottext
  4281.          DO gentext
  4282.       CASE objtype = c_otfield
  4283.          DO genfields
  4284.       CASE objtype = c_otbox
  4285.          DO genboxes
  4286.       CASE objtype = c_otline
  4287.          DO genlines
  4288.       CASE objtype = c_ottxtbut
  4289.          DO genpush
  4290.       CASE objtype = c_otradbut
  4291.          DO genradbut
  4292.       CASE objtype = c_otinvbut
  4293.          DO geninvbut
  4294.       CASE objtype = c_otpopup
  4295.          DO genpopup
  4296.       CASE objtype = c_otchkbox
  4297.          DO genchkbox
  4298.       CASE objtype = c_otlist
  4299.          DO genlist
  4300.       CASE objtype = c_otpicture
  4301.          DO genpicture
  4302.       CASE objtype = c_otspinner
  4303.          DO genspinner
  4304.       ENDCASE
  4305.  
  4306. *| >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  4307. *| CN Sat  01-28-9512:45:28 Changed Box Routine to display 3d Box styles
  4308.       STORE ALLTRIM(UPPER(COMMENT)) TO lc_comment
  4309.       IF ll_DO_3D .AND. "*|3D" $ lc_comment .AND. ALLTRIM(PLATFORM)="DOS"
  4310.         DO gen_3dbx WITH lc_comment
  4311.       ENDIF
  4312. *| End of Mod
  4313. *| <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  4314.  
  4315.       DO genusercode WITH c_postmode
  4316.  
  4317.    ENDSCAN
  4318.  
  4319. *| >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
  4320. *| CN Mon  01-30-9517:46:02 Resolve intersections on screen
  4321.    IF ll_DO_3D
  4322.      DO gen_3dis
  4323.    ENDIF
  4324. *| End of Mod
  4325. *| <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
  4326.  
  4327.    DO genactistmts WITH (m.sn)
  4328.    IF !m.g_noread
  4329.       DO placeread WITH (m.sn)
  4330.    ENDIF
  4331. ENDFOR
  4332. m.g_screen = 0
  4333. RETURN
  4334.  
  4335.  
  4336. *!*****************************************************************************
  4337. *!
  4338. *!      Procedure: GENUSERCODE
  4339. *!
  4340. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  4341. *!
  4342. *!*****************************************************************************
  4343. PROCEDURE genusercode
  4344. PARAMETER usermode
  4345. PRIVATE m.thelinenum, m.theline, m.thecommand, m.tagline
  4346.  
  4347. IF m.usermode = c_premode
  4348.     m.tagline = c_userprecode
  4349. ELSE
  4350.      m.tagline = c_userpostcode
  4351. ENDIF
  4352.  
  4353. m.thelinenum = ATCLINE(m.tagline, comment)
  4354. IF m.thelinenum > 0
  4355.     m.theline = MLINE(comment, m.thelinenum)
  4356.     m.thecommand = ALLTRIM(SUBSTR(m.theline, LEN(m.tagline)+1))
  4357.     \<<m.thecommand>>
  4358. ENDIF
  4359.  
  4360. *!*****************************************************************************
  4361. *!
  4362. *!      Procedure: ANYWINDOWS
  4363. *!
  4364. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  4365. *!
  4366. *!          Calls: GENACTWINDOW       (procedure in GENSCRN.PRG)
  4367. *!
  4368. *!*****************************************************************************
  4369. PROCEDURE anywindows
  4370. *)
  4371. *) ANYWINDOWS - Issue ACTIVATE WINDOW ... SAME.
  4372. *)
  4373. *) Description:
  4374. *) If windows present issue ACTIVATE WINDOW...SAME to make sure
  4375. *) that the windows stack on screen in the correct order.
  4376. *)
  4377. PARAMETER m.scrnno
  4378. PRIVATE m.pos
  4379. IF m.g_noreadplain
  4380.    RETURN
  4381. ENDIF
  4382.  
  4383. IF NOT EMPTY(STYLE)
  4384.    DO genactwindow WITH m.scrnno
  4385.  
  4386.    m.g_lastwindow = g_screens[m.scrnno,2]
  4387.    m.pos = ASCAN(g_wndows, m.g_lastwindow)
  4388.    * m.pos contains the element number (not the row) that matches.
  4389.    * The element number + 1 is a number representing window sequence.
  4390.    IF EMPTY(g_wndows[m.pos+1])
  4391.       m.g_nwindows = m.g_nwindows + 1
  4392.       g_wndows[m.pos+1] = m.g_nwindows
  4393.    ENDIF
  4394.  
  4395.    m.g_defasch1 = SCHEME
  4396.    m.g_defasch2 = scheme2
  4397. ELSE
  4398.    m.g_defasch1 = 0
  4399.    m.g_defasch2 = 0
  4400.  
  4401.    IF m.g_lastwindow<>""
  4402.       \HIDE WINDOW ALL
  4403.       \ACTIVATE SCREEN
  4404.       m.g_lastwindow = ""
  4405.    ENDIF
  4406. ENDIF
  4407. RETURN
  4408.  
  4409. *!*****************************************************************************
  4410. *!
  4411. *!      Procedure: GENACTISTMTS
  4412. *!
  4413. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  4414. *!
  4415. *!*****************************************************************************
  4416. PROCEDURE genactistmts
  4417. *)
  4418. *) GENACTISTMTS - Generate Activate window statements.
  4419. *)
  4420. *) Description:
  4421. *) Generate ACTIVATE WINDOW... statements in order to activate all
  4422. *) windows which have been previously activated with SAME clause.
  4423. *)
  4424. PARAMETER m.scrnno
  4425. PRIVATE m.j, m.pos
  4426. \
  4427. IF m.scrnno=m.g_nscreens AND NOT m.g_multreads AND NOT m.g_noreadplain
  4428.    IF m.g_nwindows = 1
  4429.       \IF NOT WVISIBLE("<<g_wndows[1,1]>>")
  4430.       \    ACTIVATE WINDOW <<g_wndows[1,1]>>
  4431.       \ENDIF
  4432.       RETURN
  4433.    ENDIF
  4434.    FOR m.j = m.g_nwindows TO 1 STEP -1
  4435.       m.pos = ASCAN(g_wndows, m.j)
  4436.       * pos contains the element *numbered* j.  This will be somewhere in g_wndows[*,2].
  4437.       * Look to the preceding element to get the window name.
  4438.       IF m.pos<>0
  4439.          \IF NOT WVISIBLE("<<g_wndows[m.pos-1]>>")
  4440.          \    ACTIVATE WINDOW <<g_wndows[m.pos-1]>>
  4441.          \ENDIF
  4442.       ENDIF
  4443.    ENDFOR
  4444.    \
  4445. ENDIF
  4446. RETURN
  4447.  
  4448. *!*****************************************************************************
  4449. *!
  4450. *!      Procedure: PLACEREAD
  4451. *!
  4452. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  4453. *!
  4454. *!          Calls: ANYMODAL           (procedure in GENSCRN.PRG)
  4455. *!               : ANYLOCK            (procedure in GENSCRN.PRG)
  4456. *!               : DOPLACECLAUSE      (procedure in GENSCRN.PRG)
  4457. *!               : GENWITHCLAUSE      (procedure in GENSCRN.PRG)
  4458. *!               : GENGIVENREAD       (procedure in GENSCRN.PRG)
  4459. *!               : COMMENTBLOCK       (procedure in GENSCRN.PRG)
  4460. *!               : FINDREADCLAUSES    (procedure in GENSCRN.PRG)
  4461. *!               : GENREADCLAUSES     (procedure in GENSCRN.PRG)
  4462. *!               : GENCLAUSECODE      (procedure in GENSCRN.PRG)
  4463. *!
  4464. *!*****************************************************************************
  4465. PROCEDURE placeread
  4466. *)
  4467. *) PLACEREAD - Generate a 'READ' statement.
  4468. *)
  4469. *) Description:
  4470. *) Called once per screen in the screen set.
  4471. *) Generate a READ statement.  Depending on whether this is a single
  4472. *) or multiread the read statement may be generated between @...SAY/GETs
  4473. *) from each screen or at the end of a set of all @...SAY/GETs.
  4474. *)
  4475. PARAMETER m.scrnno
  4476. PRIVATE thispretext
  4477.  
  4478. \
  4479. IF m.g_multreads
  4480.    DO newreadclauses
  4481.    \READ
  4482.    IF m.g_readcycle AND m.scrnno = m.g_nscreens
  4483.       \\ CYCLE
  4484.    ENDIF
  4485.    DO anymodal
  4486.    DO anylock
  4487.    DO doplaceclause WITH m.scrnno
  4488.    DO genwithclause
  4489.    DO gengivenread WITH m.scrnno
  4490. ELSE
  4491.    IF NOT EMPTY(m.g_rddir) AND m.scrnno = m.g_nscreens
  4492.       DO commentblock WITH "","READ contains clauses from SCREEN "+;
  4493.          LOWER(g_screens[m.g_rddirno,5])
  4494.    ENDIF
  4495.    DO findreadclauses WITH m.scrnno
  4496.    IF m.scrnno = m.g_nscreens
  4497.       \READ
  4498.       IF m.g_readcycle
  4499.          \\ CYCLE
  4500.       ENDIF
  4501.       DO anymodal
  4502.       DO anylock
  4503.       DO genreadclauses
  4504.       DO genwithclause
  4505.       DO gengivenread WITH m.scrnno
  4506.       _TEXT = m.g_tmphandle
  4507.       m.thispretext = _PRETEXT
  4508.       _PRETEXT = ""
  4509.       DO genclausecode WITH m.scrnno
  4510.       _TEXT = m.g_orghandle
  4511.       _PRETEXT = m.thispretext
  4512.    ENDIF
  4513. ENDIF
  4514. \
  4515. RETURN
  4516.  
  4517. *!*****************************************************************************
  4518. *!
  4519. *!      Procedure: ANYMODAL
  4520. *!
  4521. *!      Called by: PLACEREAD          (procedure in GENSCRN.PRG)
  4522. *!
  4523. *!*****************************************************************************
  4524. *)
  4525. *) ANYMODAL - Generate MODAL clause on READ.
  4526. *)
  4527. PROCEDURE anymodal
  4528. IF m.g_readmodal
  4529.    \\ MODAL
  4530. ENDIF
  4531. RETURN
  4532.  
  4533. *!*****************************************************************************
  4534. *!
  4535. *!      Procedure: ANYLOCK
  4536. *!
  4537. *!      Called by: PLACEREAD          (procedure in GENSCRN.PRG)
  4538. *!
  4539. *!*****************************************************************************
  4540. PROCEDURE anylock
  4541. *)
  4542. *) ANYLOCK - Generate LOCK/NOLOCK clause on READ.
  4543. *)
  4544. IF m.g_readlock
  4545.    \\ NOLOCK
  4546. ENDIF
  4547. RETURN
  4548.  
  4549. *!*****************************************************************************
  4550. *!
  4551. *!      Procedure: GENWITHCLAUSE
  4552. *!
  4553. *!      Called by: PLACEREAD          (procedure in GENSCRN.PRG)
  4554. *!
  4555. *!*****************************************************************************
  4556. PROCEDURE genwithclause
  4557. *)
  4558. *) GENWITHCLAUSE - Generate WITH clause on a READ.
  4559. *)
  4560. IF NOT EMPTY(m.g_withlist)
  4561.    \\ ;
  4562.    \    WITH <<m.g_withlist>>
  4563. ENDIF
  4564. RETURN
  4565.  
  4566. *!*****************************************************************************
  4567. *!
  4568. *!      Procedure: DOPLACECLAUSE
  4569. *!
  4570. *!      Called by: PLACEREAD          (procedure in GENSCRN.PRG)
  4571. *!
  4572. *!          Calls: ERRORHANDLER       (procedure in GENSCRN.PRG)
  4573. *!               : FINDREADCLAUSES    (procedure in GENSCRN.PRG)
  4574. *!               : GENREADCLAUSES     (procedure in GENSCRN.PRG)
  4575. *!               : GENCLAUSECODE      (procedure in GENSCRN.PRG)
  4576. *!
  4577. *!*****************************************************************************
  4578. PROCEDURE doplaceclause
  4579. *)
  4580. *) DOPLACECLAUSE - Place READ level clauses for multiple reads.
  4581. *)
  4582. *) Description:
  4583. *) According to the read level clauses encoded in the screen file
  4584. *) set variables holding information about each clause.
  4585. *)
  4586. PARAMETER m.scrnno
  4587. PRIVATE thispretext
  4588. IF g_screens[m.scrnno, 6]
  4589.    LOCATE FOR objtype = c_otscreen
  4590. ELSE
  4591.    LOCATE FOR platform = g_screens[m.scrnno, 7] AND objtype = c_otscreen
  4592. ENDIF
  4593. IF NOT FOUND()
  4594.    DO errorhandler WITH "Error in SCX: Objtype=1 not found",;
  4595.       LINENO(), c_error_3
  4596.    RETURN
  4597. ENDIF
  4598.  
  4599. DO findreadclauses WITH m.scrnno
  4600. DO genreadclauses
  4601. _TEXT = m.g_tmphandle
  4602. m.thispretext = _PRETEXT
  4603. _PRETEXT = ""
  4604.  
  4605. DO genclausecode WITH m.scrnno
  4606. _TEXT = m.g_orghandle
  4607. _PRETEXT = m.thispretext
  4608. RETURN
  4609.  
  4610. *!*****************************************************************************
  4611. *!
  4612. *!      Procedure: FINDREADCLAUSES
  4613. *!
  4614. *!      Called by: PLACEREAD          (procedure in GENSCRN.PRG)
  4615. *!               : DOPLACECLAUSE      (procedure in GENSCRN.PRG)
  4616. *!
  4617. *!          Calls: ERRORHANDLER       (procedure in GENSCRN.PRG)
  4618. *!               : SETCLAUSEFLAGS     (procedure in GENSCRN.PRG)
  4619. *!               : ORCLAUSEFLAGS      (procedure in GENSCRN.PRG)
  4620. *!
  4621. *!*****************************************************************************
  4622. PROCEDURE findreadclauses
  4623. *)
  4624. *) FINDREADCLAUSES - Find clauses for the final READ statement.
  4625. *)
  4626. *) Description:
  4627. *) Keep track of clauses that were already seen to determine what
  4628. *) clauses are placed on final read.  If this procedure is called for
  4629. *) a multiple read setting, flag's settings apply only to the current
  4630. *) screen.
  4631. *)
  4632. PARAMETER m.scrnno
  4633. PRIVATE m.dbalias, m.cur_rec
  4634. IF g_screens[m.scrnno,6]
  4635.    LOCATE FOR objtype = c_otscreen
  4636. ELSE
  4637.    LOCATE FOR platform = g_screens[m.scrnno, 7] AND objtype = c_otscreen
  4638. ENDIF
  4639. IF NOT FOUND()
  4640.    DO errorhandler WITH "Error in SCX: Objtype=1 not found",;
  4641.       LINENO(), c_error_3
  4642.    RETURN
  4643. ENDIF
  4644.  
  4645. IF EMPTY(m.g_validtype) AND !EMPTY(VALID)
  4646.    DO setclauseflags WITH validtype, VALID, m.g_validname,;
  4647.       m.g_validtype
  4648. ENDIF
  4649. IF EMPTY(m.g_whentype) AND !EMPTY(WHEN)
  4650.    DO setclauseflags  WITH whentype, WHEN, m.g_whenname,;
  4651.       m.g_whentype
  4652. ENDIF
  4653. IF EMPTY(m.g_actitype) AND !EMPTY(ACTIVATE)
  4654.    DO setclauseflags WITH activtype, ACTIVATE, m.g_actiname,;
  4655.       m.g_actitype
  4656. ENDIF
  4657. IF EMPTY(m.g_deattype) AND !EMPTY(DEACTIVATE)
  4658.    DO setclauseflags WITH deacttype, DEACTIVATE, m.g_deatname,;
  4659.       m.g_deattype
  4660. ENDIF
  4661.  
  4662. * SHOW is a special case since it can be generated with both procedures (for refreshable
  4663. * SAYs or just regular procedures) and expressions.  OR the flags together.
  4664. IF !EMPTY(SHOW)
  4665.    IF showtype != c_genexpr
  4666.       DO orclauseflags WITH showtype, SHOW, m.g_showname, m.g_showtype
  4667.    ELSE
  4668.       m.cur_rec = RECNO()
  4669.       * It's an expression, but look for refreshable SAYs too.
  4670.       LOCATE FOR ((objtype = c_otfield AND objcode = c_sgsay) OR (objtype = c_otpicture)) AND ;
  4671.          REFRESH = .T. AND (g_screens[m.scrnno, 6] OR platform = g_screens[m.scrnno, 7])
  4672.       IF FOUND()
  4673.          GOTO m.cur_rec
  4674.          DO orclauseflags WITH c_genboth, SHOW,   m.g_showname, m.g_showtype
  4675.       ELSE
  4676.          GOTO m.cur_rec
  4677.          DO orclauseflags WITH c_genexpr, SHOW,   m.g_showname, m.g_showtype
  4678.       ENDIF
  4679.       m.g_showexpr = m.g_showname
  4680.    ENDIF
  4681. ELSE
  4682.    * Look for refreshable SAYS
  4683.    LOCATE FOR ((objtype = c_otfield AND objcode = c_sgsay) OR (objtype = c_otpicture)) AND ;
  4684.       REFRESH = .T. AND (g_screens[m.scrnno, 6] OR platform = g_screens[m.scrnno, 7])
  4685.    IF FOUND()
  4686.       DO orclauseflags WITH c_gencode, SHOW,   m.g_showname, m.g_showtype
  4687.    ENDIF
  4688. ENDIF
  4689. RETURN
  4690.  
  4691. *!*****************************************************************************
  4692. *!
  4693. *!      Procedure: SETCLAUSEFLAGS
  4694. *!
  4695. *!      Called by: FINDREADCLAUSES    (procedure in GENSCRN.PRG)
  4696. *!
  4697. *!          Calls: GETCNAME()         (function  in GENSCRN.PRG)
  4698. *!
  4699. *!*****************************************************************************
  4700. PROCEDURE setclauseflags
  4701. *)
  4702. *) SETCLAUSEFLAGS - Load global flags with information about clauses.
  4703. *)
  4704. *) Description:
  4705. *) If a clause is a snippet then a generic name is provided for the
  4706. *) clause call statement in the READ and that same name is used to
  4707. *) construct the corresponding function.
  4708. *)
  4709. *) The BOTH setting is used for SHOW clauses that are defined as expressions,
  4710. *) in screens that also contain refreshable SAYS.  We have to generate a
  4711. *) procedure to contain the code to refresh the SAYS.
  4712. *)
  4713. PARAMETER m.flagtype, m.memo, m.name, m.type
  4714. DO CASE
  4715. CASE m.flagtype = c_genexpr
  4716.    m.name = m.memo
  4717.    m.type = "EXPR"
  4718. CASE m.flagtype = c_genboth
  4719.    m.name = m.memo
  4720.    m.type = "BOTH"
  4721. OTHERWISE
  4722.    m.name = getcname(m.memo)
  4723.    m.type = "CODE"
  4724. ENDCASE
  4725. RETURN
  4726.  
  4727. *!*****************************************************************************
  4728. *!
  4729. *!      Procedure: ORCLAUSEFLAGS
  4730. *!
  4731. *!      Called by: FINDREADCLAUSES    (procedure in GENSCRN.PRG)
  4732. *!
  4733. *!          Calls: GETCNAME()         (function  in GENSCRN.PRG)
  4734. *!
  4735. *!*****************************************************************************
  4736. PROCEDURE orclauseflags
  4737. *)
  4738. *) ORCLAUSEFLAGS - Logical OR two flagtypes
  4739. *)
  4740. PARAMETER m.flagtype, m.memo, m.name, m.type
  4741. DO CASE
  4742. CASE m.flagtype = c_genexpr
  4743.    m.name = m.memo
  4744.    IF INLIST(m.type,"BOTH","CODE")
  4745.       m.type = "BOTH"
  4746.    ELSE
  4747.       m.type = "EXPR"
  4748.    ENDIF
  4749. CASE m.flagtype = c_genboth
  4750.    m.name = m.memo
  4751.    m.type = "BOTH"
  4752. OTHERWISE
  4753.    * Code of some sort.  The expr code is different for expanded snippets, closed snippets, etc.
  4754.    * It is 2 for expanded snippets and 3 for minimized snippets, for example.
  4755.    m.name = getcname(m.memo)
  4756.    IF INLIST(m.type,"BOTH","EXPR")
  4757.       m.type = "BOTH"
  4758.    ELSE
  4759.       m.type = "CODE"
  4760.    ENDIF
  4761. ENDCASE
  4762. RETURN
  4763.  
  4764. *!*****************************************************************************
  4765. *!
  4766. *!      Procedure: GENREADCLAUSES
  4767. *!
  4768. *!      Called by: PLACEREAD          (procedure in GENSCRN.PRG)
  4769. *!               : DOPLACECLAUSE      (procedure in GENSCRN.PRG)
  4770. *!
  4771. *!          Calls: GENCLAUSE          (procedure in GENSCRN.PRG)
  4772. *!
  4773. *!*****************************************************************************
  4774. PROCEDURE genreadclauses
  4775. *)
  4776. *) GENREADCLAUSES - Generate Clauses on a READ.
  4777. *)
  4778. *) Description:
  4779. *) Check if clause is appropriate, if so call GENCLAUSE to
  4780. *) generate the clause keyword.
  4781. *)
  4782. IF NOT EMPTY(m.g_validtype)
  4783.    DO genclause WITH "VALID", m.g_validname, m.g_validtype
  4784. ENDIF
  4785. IF NOT EMPTY(m.g_whentype)
  4786.    DO genclause WITH "WHEN", m.g_whenname, m.g_whentype
  4787. ENDIF
  4788. IF NOT EMPTY(m.g_actitype)
  4789.    DO genclause WITH "ACTIVATE", m.g_actiname, m.g_actitype
  4790. ENDIF
  4791. IF NOT EMPTY(m.g_deattype)
  4792.    DO genclause WITH "DEACTIVATE", m.g_deatname, m.g_deattype
  4793. ENDIF
  4794. IF NOT EMPTY(m.g_showtype)
  4795.    DO genclause WITH "SHOW", m.g_showname, m.g_showtype, m.g_showexpr
  4796. ENDIF
  4797. RETURN
  4798.  
  4799. *!*****************************************************************************
  4800. *!
  4801. *!      Procedure: GENCLAUSE
  4802. *!
  4803. *!      Called by: GENREADCLAUSES     (procedure in GENSCRN.PRG)
  4804. *!
  4805. *!*****************************************************************************
  4806. PROCEDURE genclause
  4807. *)
  4808. *) GENCLAUSE - Generate Read Level Clause keyword.
  4809. *)
  4810. *) Description:
  4811. *) Generate SHOW,ACTIVATE,WHEN, or VALID clause keyword for a
  4812. *) READ statement.
  4813. *)
  4814. PARAMETER m.keyword, m.name, m.type, m.expr
  4815. PRIVATE m.codename
  4816. \\ ;
  4817. \    <<m.keyword>>
  4818. DO CASE
  4819. CASE m.type = "CODE"
  4820.    \\ <<m.name>>
  4821.    \\()
  4822. CASE m.type = "EXPR"
  4823.    \\ <<stripCR(m.name)>>
  4824. CASE m.type = "BOTH"
  4825.    * This is tricky.  We need to generate the user's expression followed by
  4826.    * a procedure, presumably containing code to handle refreshable SAYS in
  4827.    * a READ ... SHOW clause.  Right now, the name variable contains the
  4828.    * expression.  Emit it, generate a random name for the SHOW snippet, then
  4829.    * record that random name in the m.name field so that we can remember it
  4830.    * later.  The expression needs to come second (due to the boolean short-cutting
  4831.    * optimization in the interpreter).
  4832.    IF EMPTY(m.expr)
  4833.       m.codename = LOWER(SYS(2015))
  4834.       \\ <<m.codename>>() AND (<<stripCR(m.name)>>)
  4835.       m.name     = m.codename
  4836.    ELSE
  4837.       * There was an explicit expression passed to us.  Use it.
  4838.       m.codename = LOWER(SYS(2015))
  4839.       \\ <<m.codename>>() AND (<<stripCR(m.expr)>>)
  4840.       m.name     = m.codename
  4841.    ENDIF
  4842. ENDCASE
  4843. RETURN
  4844.  
  4845. *!*****************************************************************************
  4846. *!
  4847. *!      Procedure: GENGIVENREAD
  4848. *!
  4849. *!      Called by: PLACEREAD          (procedure in GENSCRN.PRG)
  4850. *!
  4851. *!          Calls: SEEKHEADER         (procedure in GENSCRN.PRG)
  4852. *!               : GENDIRECTIVE       (procedure in GENSCRN.PRG)
  4853. *!
  4854. *!*****************************************************************************
  4855. PROCEDURE gengivenread
  4856. *)
  4857. *) GENGIVENREAD - Generate another clause on the READ.
  4858. *)
  4859. PARAMETER m.screen
  4860. PRIVATE m.i, m.dbalias
  4861. IF m.g_multreads
  4862.    DO seekheader WITH m.screen
  4863.  
  4864.    IF ATC('#READ',setupcode) <> 0
  4865.       DO gendirective WITH ;
  4866.          MLINE(setupcode,ATCLINE('#READ',setupcode)),'#READ'
  4867.    ENDIF
  4868. ELSE
  4869.    FOR m.i = 1 TO m.g_nscreens
  4870.       m.g_screen = m.i
  4871.       m.dbalias = g_screens[m.i,5]
  4872.       SELECT (m.dbalias)
  4873.       DO seekheader WITH m.i
  4874.  
  4875.       IF ATC('#READ',setupcode)<>0
  4876.          DO gendirective WITH ;
  4877.             MLINE(setupcode,ATCLINE('#READ',setupcode)),'#READ'
  4878.          RETURN
  4879.       ENDIF
  4880.    ENDFOR
  4881.    m.g_screen = 0
  4882. ENDIF
  4883. RETURN
  4884.  
  4885. *!*****************************************************************************
  4886. *!
  4887. *!      Procedure: GENDIRECTIVE
  4888. *!
  4889. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  4890. *!               : GENGIVENREAD       (procedure in GENSCRN.PRG)
  4891. *!               : DEFWINDOWS         (procedure in GENSCRN.PRG)
  4892. *!               : GENWINDEFI         (procedure in GENSCRN.PRG)
  4893. *!
  4894. *!          Calls: SKIPWHITESPACE()   (function  in GENSCRN.PRG)
  4895. *!
  4896. *!*****************************************************************************
  4897. PROCEDURE gendirective
  4898. *)
  4899. *) GENDIRECTIVE - Process #ITSEXPRESSION, #READCLAUSES generator directives.
  4900. *)
  4901. PARAMETER m.line, m.directive
  4902. PRIVATE m.newline
  4903. IF ATC(m.directive,m.line)=1
  4904.    IF UPPER(m.directive) = '#REDE'
  4905.       m.g_redefi = .T.
  4906.       RETURN
  4907.    ENDIF
  4908.    m.newline = skipwhitespace(m.line)
  4909.    IF NOT EMPTY(m.newline)
  4910.       DO CASE
  4911.       CASE UPPER(m.directive) = '#READ'
  4912.          \\ ;
  4913.          \    <<UPPER(m.newline)>>
  4914.       CASE UPPER(m.directive) = '#WCLA'
  4915.          \\ ;
  4916.          \    <<UPPER(m.newline)>>
  4917.       CASE UPPER(m.directive) = '#ITSE'
  4918.          m.g_itse = SUBSTR(m.newline,1,1)
  4919.       ENDCASE
  4920.    ENDIF
  4921. ENDIF
  4922. RETURN
  4923.  
  4924. *!*****************************************************************************
  4925. *!
  4926. *!       Function: SKIPWHITESPACE
  4927. *!
  4928. *!      Called by: PREPWNAMES         (procedure in GENSCRN.PRG)
  4929. *!               : GENDIRECTIVE       (procedure in GENSCRN.PRG)
  4930. *!
  4931. *!*****************************************************************************
  4932. FUNCTION skipwhitespace
  4933. *)
  4934. *) SKIPWHITESPACE - Trim all white space from parameter string.
  4935. *)
  4936. PARAMETER m.line
  4937. PRIVATE m.whitespace
  4938. m.whitespace = AT(' ',m.line)
  4939. IF m.whitespace = 0
  4940.    m.whitespace = AT(CHR(9),m.line)
  4941. ENDIF
  4942. m.line = ALLTRIM(SUBSTR(m.line,m.whitespace))
  4943. DO WHILE SUBSTR(m.line,1,1) = CHR(9)
  4944.    m.line = ALLTRIM(SUBSTR(m.line, 2))
  4945. ENDDO
  4946. RETURN m.line
  4947.  
  4948. **
  4949. ** Code Generating Various Screen Objects
  4950. **
  4951.  
  4952. *!*****************************************************************************
  4953. *!
  4954. *!      Procedure: DEFPOPUPS
  4955. *!
  4956. *!      Called by: BUILDCTRL          (procedure in GENSCRN.PRG)
  4957. *!
  4958. *!          Calls: GENPOPDEFI         (procedure in GENSCRN.PRG)
  4959. *!
  4960. *!*****************************************************************************
  4961. PROCEDURE defpopups
  4962. *)
  4963. *) DEFPOPUPS - Define popups used in scrollable list definition.
  4964. *)
  4965. *) Description:
  4966. *) Define popup which is later used in the definition of a
  4967. *) scrollable list.
  4968. *)
  4969. PRIVATE m.i, m.dbalias, m.cnt, m.anylists
  4970. m.cnt = 0
  4971. FOR m.i = 1 TO m.g_nscreens
  4972.    m.g_screen = m.i
  4973.    m.anylists = .F.
  4974.    m.dbalias = g_screens[m.i,5]
  4975.    SELECT (m.dbalias)
  4976.    SCAN FOR objtype = c_otlist AND STYLE > 1 AND ;
  4977.          (g_screens[m.i, 6] OR platform = g_screens[m.i, 7])
  4978.       IF NOT m.anylists
  4979.          \
  4980.          \#REGION <<INT(m.i)>>
  4981.          m.anylists = .T.
  4982.          m.g_somepops = .T.
  4983.       ENDIF
  4984.       m.cnt = m.cnt + 1
  4985.       g_popups[m.cnt,1] = m.dbalias
  4986.       g_popups[m.cnt,2] = RECNO()
  4987.       g_popups[m.cnt,3] = LOWER(SYS(2015))
  4988.  
  4989.       IF MOD(m.cnt,25)=0
  4990.          DIMENSION g_popups[ALEN(g_popups,1)+25,3]
  4991.       ENDIF
  4992.  
  4993.       DO genpopdefi
  4994.    ENDSCAN
  4995. ENDFOR
  4996. m.g_screen = 0
  4997. RETURN
  4998.  
  4999. *!*****************************************************************************
  5000. *!
  5001. *!      Procedure: GENPOPDEFI
  5002. *!
  5003. *!      Called by: DEFPOPUPS          (procedure in GENSCRN.PRG)
  5004. *!
  5005. *!*****************************************************************************
  5006. PROCEDURE genpopdefi
  5007. *)
  5008. *) GENPOPDEFI
  5009. *)
  5010. IF m.g_noreadplain
  5011.    RETURN
  5012. ENDIF
  5013.  
  5014. \DEFINE POPUP <<g_popups[m.cnt,3]>> ;
  5015. DO CASE
  5016. CASE STYLE = 2
  5017.    \    PROMPT STRUCTURE
  5018. CASE STYLE = 3
  5019.    \    PROMPT FIELD <<ALLTRIM(Expr)>>
  5020. CASE STYLE = 4
  5021.    \    PROMPT FILES
  5022.    IF NOT EMPTY(expr)
  5023.       \\ LIKE <<ALLTRIM(Expr)>>
  5024.    ENDIF
  5025. ENDCASE
  5026. \\ ;
  5027. \    SCROLL
  5028. IF m.g_genvers = 'DOS' OR m.g_genvers = 'UNIX'
  5029.    \\ ;
  5030.    \    MARGIN ;
  5031.    \    MARK ""
  5032.    \
  5033. ENDIF
  5034. RETURN
  5035.  
  5036. *!*****************************************************************************
  5037. *!
  5038. *!      Procedure: RELPOPUPS
  5039. *!
  5040. *!      Called by: GENCLNENVIRON      (procedure in GENSCRN.PRG)
  5041. *!
  5042. *!*****************************************************************************
  5043. PROCEDURE relpopups
  5044. *)
  5045. *) RELPOPUPS - Generate code to release generated popups.
  5046. *)
  5047. *) Description:
  5048. *) Generate code to release all popups defined by the generator
  5049. *) in conjunction with generating scrollable lists.
  5050. *)
  5051. PRIVATE m.popcnt, m.i, m.margin
  5052. m.popcnt = ALEN(g_popups,1)
  5053. m.margin = 16
  5054.  
  5055. IF EMPTY(g_popups[1,1]) OR m.g_noreadplain
  5056.    RETURN
  5057. ENDIF
  5058.  
  5059. \RELEASE POPUPS <<g_popups[1,3]>>
  5060. m.i = 2
  5061. DO WHILE m.i <= m.popcnt
  5062.    IF EMPTY(g_popups[m.i,1])
  5063.       RETURN
  5064.    ENDIF
  5065.    IF m.margin > 60
  5066.       m.margin = 4
  5067.       \\,;
  5068.       \    <<g_popups[m.i,3]>>
  5069.    ELSE
  5070.       \\, <<g_popups[m.i,3]>>
  5071.    ENDIF
  5072.    m.margin = m.margin + 3 + LEN(g_popups[m.i,3])
  5073.    m.i = m.i + 1
  5074. ENDDO
  5075. \
  5076. RETURN
  5077.  
  5078. *!*****************************************************************************
  5079. *!
  5080. *!      Procedure: DEFWINDOWS
  5081. *!
  5082. *!      Called by: BUILDCTRL          (procedure in GENSCRN.PRG)
  5083. *!
  5084. *!          Calls: COMMENTBLOCK       (procedure in GENSCRN.PRG)
  5085. *!               : GENDIRECTIVE       (procedure in GENSCRN.PRG)
  5086. *!               : GENWINDEFI         (procedure in GENSCRN.PRG)
  5087. *!               : GENDESKTOP         (procedure in GENSCRN.PRG)
  5088. *!
  5089. *!*****************************************************************************
  5090. PROCEDURE defwindows
  5091. *)
  5092. *) DEFWINDOWS - Generate code for windows.
  5093. *)
  5094. *) Description:
  5095. *) Generate code to define windows designed in the screen builder.
  5096. *) Process all SCX databases and if window definitions found
  5097. *) call GENWINDEFI to define the windows.
  5098. *)
  5099. PRIVATE m.dbalias, m.pos, m.savearea, m.row, m.col, m.firstfound, m.i
  5100. m.firstfound = .T.
  5101. m.savearea = SELECT()
  5102. FOR m.i = 1 TO m.g_nscreens
  5103.    m.g_screen = m.i
  5104.    m.dbalias = g_screens[m.i,5]
  5105.    SELECT (m.dbalias)
  5106.  
  5107.    SCAN FOR objtype = c_otscreen AND ;
  5108.          (g_screens[m.i, 6] OR platform = g_screens[m.i, 7])
  5109.  
  5110.       IF m.firstfound AND !m.g_noreadplain
  5111.          DO commentblock WITH ""," Window definitions"
  5112.          m.firstfound = .F.
  5113.       ENDIF
  5114.  
  5115.       IF NOT EMPTY(STYLE)
  5116.          IF ATC('#ITSE',setupcode)<>0
  5117.             DO gendirective WITH ;
  5118.                MLINE(setupcode,ATCLINE('#ITSE',setupcode)),'#ITSE'
  5119.          ENDIF
  5120.          IF ATC('#REDE',setupcode)<>0
  5121.             DO gendirective WITH ;
  5122.                MLINE(setupcode,ATCLINE('#REDE',setupcode)),'#REDE'
  5123.          ENDIF
  5124.          DO genwindefi WITH m.i
  5125.       ELSE
  5126.          IF ATC('#ITSE',setupcode)<>0
  5127.             DO gendirective WITH ;
  5128.                MLINE(setupcode,ATCLINE('#ITSE',setupcode)),'#ITSE'
  5129.          ENDIF
  5130.          DO gendesktop WITH m.i
  5131.       ENDIF
  5132.    ENDSCAN
  5133. ENDFOR
  5134. m.g_screen = 0
  5135. SELECT (m.savearea)
  5136. RETURN
  5137.  
  5138. *!*****************************************************************************
  5139. *!
  5140. *!      Procedure: GENDESKTOP
  5141. *!
  5142. *!      Called by: DEFWINDOWS         (procedure in GENSCRN.PRG)
  5143. *!
  5144. *!          Calls: WINDOWFROMTO       (procedure in GENSCRN.PRG)
  5145. *!               : GETARRANGE         (procedure in GENSCRN.PRG)
  5146. *!               : ANYTITLEORFOOTER   (procedure in GENSCRN.PRG)
  5147. *!               : ANYFONT            (procedure in GENSCRN.PRG)
  5148. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  5149. *!               : ANYWINDOWCHARS     (procedure in GENSCRN.PRG)
  5150. *!               : ANYBORDER          (procedure in GENSCRN.PRG)
  5151. *!               : ANYWALLPAPER       (procedure in GENSCRN.PRG)
  5152. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  5153. *!               : ANYICON            (procedure in GENSCRN.PRG)
  5154. *!
  5155. *!*****************************************************************************
  5156. PROCEDURE gendesktop
  5157. *)
  5158. *) GENDESKTOP - Generate statements to change the desktop font
  5159. *)
  5160. *) Description:
  5161. *) Generate code to change the desktop font if this screen is on
  5162. *) the desktop.  This is done only if the user chose the define window
  5163. *) option in the generate dialog.
  5164. *)
  5165. PARAMETER m.g_screen
  5166. PRIVATE m.center_flag, m.arrange_flag, m.row, m.col, m.j, m.entries
  5167.  
  5168. IF (g_screens[m.g_screen, 7] != 'WINDOWS' AND g_screens[m.g_screen, 7] != 'MAC')
  5169.    RETURN
  5170. ENDIF
  5171.  
  5172. m.center_flag = .F.
  5173. m.arrange_flag = .F.
  5174.  
  5175. IF NOT m.g_defwin
  5176.    RETURN
  5177. ENDIF
  5178.  
  5179. m.g_moddesktop = .T.
  5180.  
  5181. \MODIFY WINDOW SCREEN ;
  5182.  
  5183. IF g_screens[m.g_screen,6]
  5184.    DO windowfromto
  5185.    IF m.g_genvers = "WINDOWS" OR m.g_genvers = "MAC"
  5186.       \\ ;
  5187.       \    FONT "FoxFont", 9
  5188.    ENDIF
  5189. ELSE
  5190.    SELECT (m.g_projalias)
  5191.    GOTO RECORD g_screens[m.g_screen,3]
  5192.  
  5193.    DO getarrange WITH m.dbalias, m.arrange_flag, m.center_flag
  5194.  
  5195.    DO anytitleorfooter
  5196.    DO anyfont
  5197.    DO anystyle
  5198.    DO anywindowchars
  5199.    DO anyborder
  5200.  
  5201.    IF  !EMPTY(PICTURE)
  5202.       DO anywallpaper
  5203.    ELSE
  5204.       DO anyscheme
  5205.    ENDIF
  5206.    DO anyicon
  5207.  
  5208.    IF (CENTER OR m.center_flag) AND !m.arrange_flag
  5209.       \MOVE WINDOW SCREEN CENTER
  5210.    ENDIF
  5211. ENDIF
  5212. \CLEAR
  5213. RETURN
  5214.  
  5215. *!*****************************************************************************
  5216. *!
  5217. *!      Procedure: GENWINDEFI
  5218. *!
  5219. *!      Called by: DEFWINDOWS         (procedure in GENSCRN.PRG)
  5220. *!
  5221. *!          Calls: UNIQUEWIN()        (function  in GENSCRN.PRG)
  5222. *!               : PUSHINDENT         (procedure in GENSCRN.PRG)
  5223. *!               : GETARRANGE         (procedure in GENSCRN.PRG)
  5224. *!               : ANYTITLEORFOOTER   (procedure in GENSCRN.PRG)
  5225. *!               : ANYFONT            (procedure in GENSCRN.PRG)
  5226. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  5227. *!               : ANYWINDOWCHARS     (procedure in GENSCRN.PRG)
  5228. *!               : ANYBORDER          (procedure in GENSCRN.PRG)
  5229. *!               : ANYWALLPAPER       (procedure in GENSCRN.PRG)
  5230. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  5231. *!               : ANYICON            (procedure in GENSCRN.PRG)
  5232. *!               : GENDIRECTIVE       (procedure in GENSCRN.PRG)
  5233. *!               : POPINDENT          (procedure in GENSCRN.PRG)
  5234. *!
  5235. *!*****************************************************************************
  5236. PROCEDURE genwindefi
  5237. *)
  5238. *) GENWINDEFI - Generate window definition
  5239. *)
  5240. *) Description:
  5241. *) Check to see if window name is unique, if not provide a unique name
  5242. *) with the use of SYS(2015) and display a warning message if
  5243. *) appropriate.  The window definition is generated only if the
  5244. *) user selected that option in the generator dialog.
  5245. *)
  5246. PARAMETER m.g_screen
  5247. PRIVATE m.name, m.pos, m.dupname, m.arrange_flag, m.center_flag, m.in_parms, m.j
  5248. m.arrange_flag = .F.
  5249. m.center_flag = .F.
  5250. m.dupname = .F.
  5251. m.name = IIF(!EMPTY(g_screens[m.g_screen,2]), g_screens[m.g_screen,2], LOWER(SYS(2015)))
  5252. m.pos = uniquewin(LOWER(m.name), m.g_nwindows, @g_wndows)
  5253. IF m.pos = 0
  5254.    m.dupname = .T.
  5255.    m.name = LOWER(SYS(2015))
  5256.    g_screens[m.g_screen,2] = m.name
  5257.    m.pos = uniquewin(m.name, m.g_nwindows, @g_wndows)
  5258. ENDIF
  5259.  
  5260. * Insert one row (two elements)
  5261. = AINS(g_wndows, m.pos)
  5262. g_wndows[m.pos,1] = m.name
  5263. g_wndows[m.pos,2] = .F.  && it will get a sequence number in AnyWindows
  5264. m.g_nwindows = m.g_nwindows + 1
  5265.  
  5266. m.g_windows = .T.
  5267. IF NOT m.g_defwin
  5268.    RETURN
  5269. ENDIF
  5270.  
  5271. IF NOT m.g_redefi
  5272.    \IF NOT WEXIST("<<m.name>>")
  5273.    * We can safely omit this extra code if the name was a randomly generated one
  5274.    IF  UPPER(LEFT(m.name,2)) <> UPPER(LEFT(SYS(2015),2))
  5275.       \\ ;
  5276.       \    OR UPPER(WTITLE("<<UPPER(m.name)>>")) == "<<UPPER(forceext(m.name,'PJX'))>>" ;
  5277.       \    OR UPPER(WTITLE("<<UPPER(m.name)>>")) == "<<UPPER(forceext(m.name,'SCX'))>>" ;
  5278.       \    OR UPPER(WTITLE("<<UPPER(m.name)>>")) == "<<UPPER(forceext(m.name,'MNX'))>>" ;
  5279.       \    OR UPPER(WTITLE("<<UPPER(m.name)>>")) == "<<UPPER(forceext(m.name,'PRG'))>>" ;
  5280.       \    OR UPPER(WTITLE("<<UPPER(m.name)>>")) == "<<UPPER(forceext(m.name,'FRX'))>>" ;
  5281.       \    OR UPPER(WTITLE("<<UPPER(m.name)>>")) == "<<UPPER(forceext(m.name,'QPR'))>>"
  5282.    ENDIF
  5283.    DO pushindent
  5284. ENDIF
  5285. \DEFINE WINDOW <<m.name>> ;
  5286.  
  5287. SELECT (m.g_projalias)
  5288. GOTO RECORD g_screens[m.g_screen,3]
  5289.  
  5290. DO getarrange WITH m.dbalias, m.arrange_flag, m.center_flag
  5291.  
  5292. DO anytitleorfooter
  5293. DO anyfont
  5294. DO anystyle
  5295. DO anywindowchars
  5296. DO anyborder
  5297.  
  5298. IF (g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC')
  5299.    IF TAB
  5300.       \\ ;
  5301.       \    HALFHEIGHT
  5302.    ENDIF
  5303.    IF  !EMPTY(PICTURE)
  5304.       DO anywallpaper
  5305.    ELSE
  5306.       DO anyscheme
  5307.    ENDIF
  5308.    DO anyicon
  5309. ELSE
  5310.    DO anyscheme
  5311. ENDIF
  5312.  
  5313. * If the user defined additional window clauses, put them here
  5314. IF ATC("#WCLA",setupcode) > 0
  5315.    DO gendirective WITH ;
  5316.       MLINE(setupcode,ATCLINE('#WCLA',setupcode)),'#WCLA'
  5317. ENDIF
  5318.  
  5319. * Emit the MOVE WINDOW ... CENTER after all the window clauses have been emitted
  5320. IF (g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC')
  5321.    IF (CENTER OR m.center_flag) AND !m.arrange_flag
  5322.       \MOVE WINDOW <<m.name>> CENTER
  5323.    ENDIF
  5324. ENDIF
  5325.  
  5326. IF !m.g_redefi
  5327.    DO popindent
  5328.    \ENDIF
  5329. ENDIF
  5330. \
  5331. RETURN
  5332.  
  5333. *!*****************************************************************************
  5334. *!
  5335. *!      Procedure: GETARRANGE
  5336. *!
  5337. *!      Called by: GENDESKTOP         (procedure in GENSCRN.PRG)
  5338. *!               : GENWINDEFI         (procedure in GENSCRN.PRG)
  5339. *!
  5340. *!          Calls: WINDOWFROMTO       (procedure in GENSCRN.PRG)
  5341. *!
  5342. *!*****************************************************************************
  5343. PROCEDURE getarrange
  5344. PARAMETER m.dbalias, m.arrange_flag, m.center_flag
  5345. PRIVATE m.j, m.pname, m.entries, m.row, m.col
  5346. IF !EMPTY(arranged)
  5347.    m.entries = INT(LEN(arranged)/26)
  5348.    m.j = 1
  5349.    DO WHILE m.j <= m.entries
  5350.       m.pname = ALLTRIM(UPPER(SUBSTR(arranged,(m.j-1)*26+1,8)))
  5351.       m.pname = ALLTRIM(CHRTRAN(m.pname,CHR(0)," "))
  5352.       IF m.pname == m.g_genvers    && found the right one
  5353.          IF INLIST(UPPER(SUBSTR(arranged,(m.j-1)*26 + 9,1)),'Y','T')    && is it arranged?
  5354.             IF INLIST(UPPER(SUBSTR(arranged,(m.j-1)*26 +10,1)),'Y','T') && is it centered?
  5355.                m.center_flag = .T.
  5356.             ELSE
  5357.                m.arrange_flag = .T.
  5358.                m.row = VAL(SUBSTR(arranged,(m.j-1)*26 + 11,8))
  5359.                m.col = VAL(SUBSTR(arranged,(m.j-1)*26 + 19,8))
  5360.             ENDIF
  5361.          ENDIF
  5362.          EXIT
  5363.       ENDIF
  5364.       m.j = m.j + 1
  5365.    ENDDO
  5366. ENDIF
  5367. SELECT (m.dbalias)
  5368. IF m.arrange_flag
  5369.    DO windowfromto WITH m.row, m.col
  5370. ELSE
  5371.    DO windowfromto
  5372. ENDIF
  5373. RETURN
  5374.  
  5375. *!*****************************************************************************
  5376. *!
  5377. *!      Procedure: GENBOXES
  5378. *!
  5379. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  5380. *!
  5381. *!          Calls: ANYPATTERN         (procedure in GENSCRN.PRG)
  5382. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  5383. *!               : ANYPEN             (procedure in GENSCRN.PRG)
  5384. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  5385. *!
  5386. *!*****************************************************************************
  5387. PROCEDURE genboxes
  5388. *)
  5389. *) GENBOXES - Generate code for boxes.
  5390. *)
  5391. *) Description:
  5392. *) Generate code to display all boxes as they appear on the painted
  5393. *) screen(s).  Note since there is no FILL clause on @...TO command
  5394. *) we use the command @...BOX whenever the fill option has been chosen.
  5395. *) If Fill option is not chosen, then we use the simpler form for
  5396. *) generating boxes, @...TO command which supplies us with clauses
  5397. *) DOUBLE and PANEL for the box borders.
  5398. *)
  5399. PRIVATE m.bottom, m.right, m.thisbox
  5400. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  5401.    SET DECIMALS TO 3
  5402.    m.bottom = HEIGHT+vpos
  5403.    m.right = WIDTH+hpos
  5404. ELSE
  5405.    m.bottom = HEIGHT+vpos-1
  5406.    m.right = WIDTH+hpos-1
  5407. ENDIF
  5408. IF (m.g_genvers = 'WINDOWS' OR m.g_genvers = 'MAC')
  5409.    IF fillchar <> c_null AND fillchar <> " "
  5410.       \@ <<Vpos>>,<<Hpos>>,<<m.bottom>>,<<m.right>>
  5411.       DO CASE
  5412.       CASE objcode = c_sgbox
  5413.          m.thisbox = c_single
  5414.          \\ BOX "<<m.thisbox>><<Fillchar>>"
  5415.       CASE objcode = c_sgboxd
  5416.          m.thisbox = c_double
  5417.          \\ BOX "<<m.thisbox>><<Fillchar>>"
  5418.       CASE objcode = c_sgboxp
  5419.          m.thisbox = c_panel
  5420.          \\ BOX "<<m.thisbox>><<Fillchar>>"
  5421.       CASE objcode = c_sgboxc
  5422.          IF boxchar = '"'
  5423.             \\ BOX REPLICATE('<<Boxchar>>',8)
  5424.          ELSE
  5425.             \\ BOX REPLICATE("<<Boxchar>>",8)
  5426.          ENDIF
  5427.          IF fillchar = '"'
  5428.             \\+'<<Fillchar>>'
  5429.          ELSE
  5430.             \\+"<<Fillchar>>"
  5431.          ENDIF
  5432.       ENDCASE
  5433.       SET DECIMALS TO 0
  5434.       RETURN
  5435.    ELSE
  5436.       \@ <<Vpos>>,<<Hpos>> TO <<m.bottom>>,<<m.right>>
  5437.    ENDIF
  5438. ELSE
  5439.    IF fillchar <> c_null
  5440.       \@ <<Vpos>>,<<Hpos>>,<<m.bottom>>,<<m.right>>
  5441.       DO CASE
  5442.       CASE objcode = c_sgbox
  5443.          m.thisbox = c_single
  5444.          \\ BOX "<<m.thisbox>><<Fillchar>>"
  5445.       CASE objcode = c_sgboxd
  5446.          m.thisbox = c_double
  5447.          \\ BOX "<<m.thisbox>><<Fillchar>>"
  5448.       CASE objcode = c_sgboxp
  5449.          m.thisbox = c_panel
  5450.          \\ BOX "<<m.thisbox>><<Fillchar>>"
  5451.       CASE objcode = c_sgboxc
  5452.          IF boxchar = '"'
  5453.             \\ BOX REPLICATE('<<Boxchar>>',8)
  5454.          ELSE
  5455.             \\ BOX REPLICATE("<<Boxchar>>",8)
  5456.          ENDIF
  5457.          IF fillchar = '"'
  5458.             \\+'<<Fillchar>>'
  5459.          ELSE
  5460.             \\+"<<Fillchar>>"
  5461.          ENDIF
  5462.       ENDCASE
  5463.  
  5464.       IF (!EMPTY(colorpair) OR SCHEME <> 0)
  5465.          * Color the inside of the box if it is filled with something.
  5466.          \@ <<Vpos>>,<<Hpos>> FILL TO <<m.bottom>>,<<m.right>>
  5467.          DO anypattern
  5468.          DO anyscheme
  5469.       ENDIF
  5470.       SET DECIMALS TO 0
  5471.       RETURN
  5472.    ELSE
  5473.       \@ <<Vpos>>,<<Hpos>> TO <<m.bottom>>,<<m.right>>
  5474.    ENDIF
  5475. ENDIF
  5476. SET DECIMALS TO 0
  5477. DO CASE
  5478. CASE objcode = c_sgboxd
  5479.    \\ DOUBLE
  5480. CASE objcode = c_sgboxp
  5481.    \\ PANEL
  5482. CASE objcode = c_sgboxc
  5483.    IF boxchar = '"'
  5484.       \\ '<<Boxchar>>'
  5485.    ELSE
  5486.       \\ "<<Boxchar>>"
  5487.    ENDIF
  5488. ENDCASE
  5489. DO anypattern
  5490. DO anypen
  5491. DO anystyle
  5492. DO anyscheme
  5493. RETURN
  5494.  
  5495. *!*****************************************************************************
  5496. *!
  5497. *!      Procedure: GENLINES
  5498. *!
  5499. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  5500. *!
  5501. *!          Calls: ANYPEN             (procedure in GENSCRN.PRG)
  5502. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  5503. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  5504. *!
  5505. *!*****************************************************************************
  5506. PROCEDURE genlines
  5507. *)
  5508. *) GENLINES - Generate code for lines.
  5509. *)
  5510. *) Description:
  5511. *) Generate code to display all lines as they appear on the painted
  5512. *) screen(s).
  5513. *)
  5514. PRIVATE m.x, m.y
  5515. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  5516.    SET DECIMALS TO 3
  5517.    IF STYLE = 0
  5518.       m.x = HEIGHT+vpos
  5519.       m.y = hpos
  5520.    ELSE
  5521.       m.x = vpos
  5522.       m.y = WIDTH+hpos
  5523.    ENDIF
  5524. ELSE
  5525.    m.x = HEIGHT+vpos-1
  5526.    m.y = WIDTH+hpos-1
  5527. ENDIF
  5528.  
  5529. \@ <<Vpos>>,<<Hpos>> TO <<m.x>>,<<m.y>>
  5530. SET DECIMALS TO 0
  5531. IF BORDER = 1
  5532.    \\ DOUBLE
  5533. ENDIF
  5534. DO anypen
  5535. DO anystyle
  5536. DO anyscheme
  5537. RETURN
  5538.  
  5539.  
  5540. *!*****************************************************************************
  5541. *!
  5542. *!      Procedure: GENTEXT
  5543. *!
  5544. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  5545. *!
  5546. *!          Calls: ANYPICTURE         (procedure in GENSCRN.PRG)
  5547. *!               : ANYFONT            (procedure in GENSCRN.PRG)
  5548. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  5549. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  5550. *!
  5551. *!*****************************************************************************
  5552. PROCEDURE gentext
  5553. *)
  5554. *) GENTEXT - Generate code for text.
  5555. *)
  5556. *) Description:
  5557. *) Generate code that will display the text exactly as it appears
  5558. *) in the painted screen(s).
  5559. *)
  5560. PRIVATE m.theexpr, m.occur, m.pos
  5561. m.theexpr = expr
  5562. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  5563.    SET DECIMALS TO 3
  5564.    m.occur = 1
  5565.    m.pos = AT(CHR(13), m.theexpr, m.occur)
  5566.    * Sometimes the screen builder surrounds text with single quotes and other
  5567.    * times with double quotes.
  5568.    q1 = LEFT(LTRIM(m.theexpr),1)
  5569.  
  5570.    DO WHILE m.pos > 0
  5571.       DO CASE
  5572.       CASE q1 = "'"
  5573.          m.theexpr = LEFT(m.theexpr, m.pos -1) + ;
  5574.             "' + CHR(13) + ;" + CHR(13)  + CHR(9) + CHR(9) + "'" ;
  5575.             + SUBSTR(m.theexpr, m.pos + 1)
  5576.       CASE q1 = '['
  5577.          m.theexpr = LEFT(m.theexpr, m.pos -1) + ;
  5578.             "] + CHR(13) + ;" + CHR(13)  + CHR(9) + CHR(9) + "[" ;
  5579.             + SUBSTR(m.theexpr, m.pos + 1)
  5580.       OTHERWISE
  5581.          m.theexpr = LEFT(m.theexpr, m.pos -1) + ;
  5582.             '" + CHR(13) + ;' + CHR(13)  + CHR(9) + CHR(9) + '"' ;
  5583.             + SUBSTR(m.theexpr, m.pos + 1)
  5584.       ENDCASE
  5585.       m.occur = m.occur + 1
  5586.       m.pos = AT(CHR(13), m.theexpr, m.occur)
  5587.    ENDDO
  5588.    \@ <<Vpos>>,<<Hpos>> SAY <<m.theexpr>>
  5589.    IF height > 1
  5590.       \\ ;
  5591.       \    SIZE <<Height>>,<<Width>>, <<Spacing>>
  5592.    ENDIF
  5593. ELSE
  5594.    \@ <<Vpos>>,<<Hpos>> SAY <<m.theexpr>> ;
  5595.    \    SIZE <<Height>>,<<Width>>, <<Spacing>>
  5596. ENDIF
  5597.  
  5598. SET DECIMALS TO 0
  5599. DO anypicture
  5600. DO anyfont
  5601. DO anystyle
  5602. DO anyscheme
  5603. RETURN
  5604.  
  5605. *!*****************************************************************************
  5606. *!
  5607. *!      Procedure: GENFIELDS
  5608. *!
  5609. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  5610. *!
  5611. *!          Calls: ANYFONT            (procedure in GENSCRN.PRG)
  5612. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  5613. *!               : ANYPICTURE         (procedure in GENSCRN.PRG)
  5614. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  5615. *!               : ELEMRANGE          (procedure in GENSCRN.PRG)
  5616. *!               : GENTXTRGN          (procedure in GENSCRN.PRG)
  5617. *!               : GENDEFAULT         (procedure in GENSCRN.PRG)
  5618. *!               : ANYWHEN            (procedure in GENSCRN.PRG)
  5619. *!               : ANYVALID           (procedure in GENSCRN.PRG)
  5620. *!               : ANYMESSAGE         (procedure in GENSCRN.PRG)
  5621. *!               : ANYERROR           (procedure in GENSCRN.PRG)
  5622. *!               : ANYDISABLED        (procedure in GENSCRN.PRG)
  5623. *!
  5624. *!*****************************************************************************
  5625. PROCEDURE genfields
  5626. *)
  5627. *) GENFIELDS - Generate fields.
  5628. *)
  5629. *) Description:
  5630. *) Generate code to display SAY, GET, and EDIT statements exactly as they
  5631. *) appear in the painted screen(s).
  5632. *)
  5633. PRIVATE m.theexpr
  5634. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  5635.    SET DECIMALS TO 3
  5636. ENDIF
  5637. DO CASE
  5638. CASE objcode = c_sgsay
  5639.    m.theexpr = expr
  5640.    \@ <<Vpos>>,<<Hpos>> SAY <<m.theexpr>> ;
  5641.    \    SIZE <<Height>>,<<Width>>
  5642.    SET DECIMALS TO 0
  5643.    DO anyfont
  5644.    DO anystyle
  5645.    DO anypicture
  5646.    DO anyscheme
  5647.    RETURN
  5648. CASE objcode = c_sgget
  5649.    \@ <<Vpos>>,<<Hpos>> GET <<Name>> ;
  5650.    \    SIZE <<Height>>,<<Width>>
  5651.    DO elemrange
  5652. CASE objcode = c_sgedit
  5653.    DO gentxtrgn
  5654.    RETURN
  5655. ENDCASE
  5656. SET DECIMALS TO 0
  5657.  
  5658. DO gendefault
  5659. DO anyfont
  5660. DO anystyle
  5661. DO anypicture
  5662. DO anywhen
  5663. DO anyvalid
  5664. DO anymessage
  5665. DO anyerror
  5666. DO anydisabled
  5667. DO anyscheme
  5668. RETURN
  5669.  
  5670. *!*****************************************************************************
  5671. *!
  5672. *!      Procedure: GENINVBUT
  5673. *!
  5674. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  5675. *!
  5676. *!          Calls: ANYFONT            (procedure in GENSCRN.PRG)
  5677. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  5678. *!               : ANYWHEN            (procedure in GENSCRN.PRG)
  5679. *!               : ANYVALID           (procedure in GENSCRN.PRG)
  5680. *!               : ANYDISABLED        (procedure in GENSCRN.PRG)
  5681. *!               : ANYMESSAGE         (procedure in GENSCRN.PRG)
  5682. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  5683. *!
  5684. *!*****************************************************************************
  5685. PROCEDURE geninvbut
  5686. *)
  5687. *) GENINVBUT - Generate Invisible buttons.
  5688. *)
  5689. *) Description:
  5690. *) Generate code to display invisible buttons exactly as they appear
  5691. *) in the painted screen(s).
  5692. *)
  5693.  
  5694. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  5695.    SET DECIMALS TO 3
  5696. ENDIF
  5697. \@ <<Vpos>>,<<Hpos>> GET <<Name>> ;
  5698. \    PICTURE <<Picture>> ;
  5699. \    SIZE <<Height>>,<<Width>>,<<Spacing>> ;
  5700. \    DEFAULT 0
  5701. SET DECIMALS TO 0
  5702.  
  5703. DO anyfont
  5704. DO anystyle
  5705. DO anywhen
  5706. DO anyvalid
  5707. DO anydisabled
  5708. DO anymessage
  5709. DO anyscheme
  5710. RETURN
  5711.  
  5712. *!*****************************************************************************
  5713. *!
  5714. *!      Procedure: GENTXTRGN
  5715. *!
  5716. *!      Called by: GENFIELDS          (procedure in GENSCRN.PRG)
  5717. *!
  5718. *!          Calls: ANYPICTURE         (procedure in GENSCRN.PRG)
  5719. *!               : GENDEFAULT         (procedure in GENSCRN.PRG)
  5720. *!               : ANYFONT            (procedure in GENSCRN.PRG)
  5721. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  5722. *!               : ANYTAB             (procedure in GENSCRN.PRG)
  5723. *!               : ANYSCROLL          (procedure in GENSCRN.PRG)
  5724. *!               : ANYWHEN            (procedure in GENSCRN.PRG)
  5725. *!               : ANYVALID           (procedure in GENSCRN.PRG)
  5726. *!               : ANYMESSAGE         (procedure in GENSCRN.PRG)
  5727. *!               : ANYERROR           (procedure in GENSCRN.PRG)
  5728. *!               : ANYDISABLED        (procedure in GENSCRN.PRG)
  5729. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  5730. *!
  5731. *!*****************************************************************************
  5732. PROCEDURE gentxtrgn
  5733. *)
  5734. *) GENTXTRGN - Generate some statements for text edit region.
  5735. *)
  5736. *) Description:
  5737. *) Generate code to display text edit regions exactly as they
  5738. *) appear on the painted screen(s).
  5739. *)
  5740. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  5741.    SET DECIMALS TO 3
  5742. ENDIF
  5743. \@ <<Vpos>>,<<Hpos>> EDIT <<Name>> ;
  5744. \    SIZE <<IIF(Height < 1, 1, Height)>>,<<Width>>,<<Initialnum>>
  5745. SET DECIMALS TO 0
  5746.  
  5747. IF NOT EMPTY(PICTURE)
  5748.    DO anypicture
  5749. ENDIF
  5750. DO gendefault
  5751. DO anyfont
  5752. DO anystyle
  5753. DO anytab
  5754. DO anyscroll
  5755. DO anywhen
  5756. DO anyvalid
  5757. DO anymessage
  5758. DO anyerror
  5759. DO anydisabled
  5760. DO anyscheme
  5761. RETURN
  5762.  
  5763. *!*****************************************************************************
  5764. *!
  5765. *!      Procedure: GENPUSH
  5766. *!
  5767. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  5768. *!
  5769. *!          Calls: ANYBITMAPCTRL      (procedure in GENSCRN.PRG)
  5770. *!               : ANYFONT            (procedure in GENSCRN.PRG)
  5771. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  5772. *!               : ANYWHEN            (procedure in GENSCRN.PRG)
  5773. *!               : ANYVALID           (procedure in GENSCRN.PRG)
  5774. *!               : ANYDISABLED        (procedure in GENSCRN.PRG)
  5775. *!               : ANYMESSAGE         (procedure in GENSCRN.PRG)
  5776. *!               : ANYERROR           (procedure in GENSCRN.PRG)
  5777. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  5778. *!
  5779. *!*****************************************************************************
  5780. PROCEDURE genpush
  5781. *)
  5782. *) GENPUSH - Generate Push buttons.
  5783. *)
  5784. *) Description:
  5785. *) Generate code to display push buttons exactly as they appear
  5786. *) in the painted screen(s).
  5787. *)
  5788. PRIVATE m.thepicture
  5789.  
  5790. m.thepicture = PICTURE
  5791. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  5792.    SET DECIMALS TO 3
  5793. ENDIF
  5794. \@ <<Vpos>>,<<Hpos>> GET <<Name>> ;
  5795. DO anybitmapctrl WITH m.thepicture
  5796. \    SIZE <<Height>>,<<Width>>,<<Spacing>> ;
  5797. SET DECIMALS TO 0
  5798. \    DEFAULT <<Initialnum>>
  5799. DO anyfont
  5800. DO anystyle
  5801. DO anywhen
  5802. DO anyvalid
  5803. DO anydisabled
  5804. DO anymessage
  5805. DO anyerror
  5806. DO anyscheme
  5807. RETURN
  5808.  
  5809. *!*****************************************************************************
  5810. *!
  5811. *!      Procedure: GENRADBUT
  5812. *!
  5813. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  5814. *!
  5815. *!          Calls: ANYBITMAPCTRL      (procedure in GENSCRN.PRG)
  5816. *!               : ANYFONT            (procedure in GENSCRN.PRG)
  5817. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  5818. *!               : ANYWHEN            (procedure in GENSCRN.PRG)
  5819. *!               : ANYVALID           (procedure in GENSCRN.PRG)
  5820. *!               : ANYDISABLED        (procedure in GENSCRN.PRG)
  5821. *!               : ANYMESSAGE         (procedure in GENSCRN.PRG)
  5822. *!               : ANYERROR           (procedure in GENSCRN.PRG)
  5823. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  5824. *!
  5825. *!*****************************************************************************
  5826. PROCEDURE genradbut
  5827. *)
  5828. *) GENRADBUT - Generate Radio Buttons.
  5829. *)
  5830. *) Description:
  5831. *) Generate code to display radio buttons exactly as they appear
  5832. *) in the painted screen(s).
  5833. *)
  5834. PRIVATE m.thepicture
  5835.  
  5836. m.thepicture = PICTURE
  5837. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  5838.    SET DECIMALS TO 3
  5839. ENDIF
  5840. \@ <<Vpos>>,<<Hpos>> GET <<Name>> ;
  5841. DO anybitmapctrl WITH m.thepicture
  5842. \    SIZE <<Height>>,<<Width>>,<<Spacing>> ;
  5843. SET DECIMALS TO 0
  5844. \    DEFAULT <<Initialnum>>
  5845. DO anyfont
  5846. DO anystyle
  5847. DO anywhen
  5848. DO anyvalid
  5849. DO anydisabled
  5850. DO anymessage
  5851. DO anyerror
  5852. DO anyscheme
  5853. RETURN
  5854.  
  5855. *!*****************************************************************************
  5856. *!
  5857. *!      Procedure: GENCHKBOX
  5858. *!
  5859. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  5860. *!
  5861. *!          Calls: ANYBITMAPCTRL      (procedure in GENSCRN.PRG)
  5862. *!               : ANYFONT            (procedure in GENSCRN.PRG)
  5863. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  5864. *!               : ANYWHEN            (procedure in GENSCRN.PRG)
  5865. *!               : ANYVALID           (procedure in GENSCRN.PRG)
  5866. *!               : ANYDISABLED        (procedure in GENSCRN.PRG)
  5867. *!               : ANYMESSAGE         (procedure in GENSCRN.PRG)
  5868. *!               : ANYERROR           (procedure in GENSCRN.PRG)
  5869. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  5870. *!
  5871. *!*****************************************************************************
  5872. PROCEDURE genchkbox
  5873. *)
  5874. *) GENCHKBOX - Generate Check Boxes
  5875. *)
  5876. *) Description:
  5877. *) Generate code to display check boxes exactly as they appear
  5878. *) in the painted screen(s).
  5879. *)
  5880. PRIVATE m.thepicture
  5881.  
  5882. m.thepicture = PICTURE
  5883. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  5884.    SET DECIMALS TO 3
  5885. ENDIF
  5886.  
  5887. \@ <<Vpos>>,<<Hpos>> GET <<Name>> ;
  5888. DO anybitmapctrl WITH m.thepicture
  5889. \    SIZE <<Height>>,<<Width>> ;
  5890. SET DECIMALS TO 0
  5891. \    DEFAULT <<Initialnum>>
  5892. DO anyfont
  5893. DO anystyle
  5894. DO anywhen
  5895. DO anyvalid
  5896. DO anydisabled
  5897. DO anymessage
  5898. DO anyerror
  5899. DO anyscheme
  5900. RETURN
  5901.  
  5902. *!*****************************************************************************
  5903. *!
  5904. *!      Procedure: GENLIST
  5905. *!
  5906. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  5907. *!
  5908. *!          Calls: CHOPPICTURE        (procedure in GENSCRN.PRG)
  5909. *!               : ELEMRANGE          (procedure in GENSCRN.PRG)
  5910. *!               : FROMPOPUP          (procedure in GENSCRN.PRG)
  5911. *!               : ANYFONT            (procedure in GENSCRN.PRG)
  5912. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  5913. *!               : ANYWHEN            (procedure in GENSCRN.PRG)
  5914. *!               : ANYVALID           (procedure in GENSCRN.PRG)
  5915. *!               : ANYDISABLED        (procedure in GENSCRN.PRG)
  5916. *!               : ANYMESSAGE         (procedure in GENSCRN.PRG)
  5917. *!               : ANYERROR           (procedure in GENSCRN.PRG)
  5918. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  5919. *!
  5920. *!*****************************************************************************
  5921. PROCEDURE genlist
  5922. *)
  5923. *) GENLIST - Generate Scrollable Lists.
  5924. *)
  5925. *) Description:
  5926. *) Generate code to display scrollable lists exactly as they appear
  5927. *) in the painted screen(s).
  5928. *)
  5929. PRIVATE m.pos, m.start
  5930. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  5931.    SET DECIMALS TO 3
  5932. ENDIF
  5933. \@ <<Vpos>>,<<Hpos>> GET <<Name>> ;
  5934. SET DECIMALS TO 0
  5935. IF NOT EMPTY(PICTURE)
  5936.    \     PICTURE
  5937.    DO choppicture WITH PICTURE
  5938.    \\ ;
  5939. ENDIF
  5940. IF STYLE = 0
  5941.    \    FROM <<Expr>>
  5942.    DO elemrange
  5943.    \\ ;
  5944.    IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  5945.       SET DECIMALS TO 3
  5946.    ENDIF
  5947.    \    SIZE <<Height>>,<<Width>> ;
  5948.    SET DECIMALS TO 0
  5949.    \    DEFAULT 1
  5950. ELSE
  5951.    DO frompopup
  5952. ENDIF
  5953.  
  5954. DO anyfont
  5955. DO anystyle
  5956. DO anywhen
  5957. DO anyvalid
  5958. DO anydisabled
  5959. DO anymessage
  5960. DO anyerror
  5961. DO anyscheme
  5962. RETURN
  5963.  
  5964. *!*****************************************************************************
  5965. *!
  5966. *!      Procedure: GENPICTURE
  5967. *!
  5968. *!      Called by: PLACESAYS          (procedure in GENSCRN.PRG)
  5969. *!               : BUILDFMT           (procedure in GENSCRN.PRG)
  5970. *!
  5971. *!          Calls: FINDRELPATH()      (function  in GENSCRN.PRG)
  5972. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  5973. *!
  5974. *!*****************************************************************************
  5975. PROCEDURE genpicture
  5976. *)
  5977. *) GENPICTURE - Generate code for pictures.
  5978. *)
  5979. *) Description:
  5980. *) Generate code to display pictures (bitmaps or bitmaps in general fields).
  5981. *)
  5982. PRIVATE m.relpath
  5983. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  5984.    SET DECIMALS TO 3
  5985.    \@ <<Vpos>>,<<Hpos>> SAY
  5986.    IF STYLE = 0
  5987.       m.relpath = LOWER(findrelpath(SUBSTR(PICTURE,2,LEN(PICTURE)-2)))
  5988.         IF EMPTY(justext(m.relpath))
  5989.            m.relpath = m.relpath + "."
  5990.         ENDIF
  5991.       \\ (LOCFILE("<<m.relpath>>",<<bitmapstr(c_all)>>, "Where is <<basename(m.relpath)>>?"
  5992.         IF _MAC
  5993.             * Use the "type" parameter to get all PICT files on the Mac,
  5994.             * regardless of extension.
  5995.             \\, "PICT"
  5996.         ENDIF
  5997.         \\ )) BITMAP ;
  5998.    ELSE
  5999.       \\ <<Name>> ;
  6000.    ENDIF
  6001.    \    SIZE <<Height>>,<<Width>>
  6002.  
  6003.    IF CENTER
  6004.       \\ ;
  6005.       \    CENTER
  6006.    ENDIF
  6007.  
  6008.    DO CASE
  6009.    CASE BORDER = 1
  6010.       \\ ;
  6011.       \    ISOMETRIC
  6012.    CASE BORDER = 2
  6013.       \\ ;
  6014.       \    STRETCH
  6015.    ENDCASE
  6016.  
  6017.    SET DECIMALS TO 0
  6018.    DO anystyle
  6019. ENDIF
  6020. RETURN
  6021.  
  6022. *!*****************************************************************************
  6023. *!
  6024. *!      Procedure: GENSPINNER
  6025. *!
  6026. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  6027. *!
  6028. *!          Calls: CHOPPICTURE        (procedure in GENSCRN.PRG)
  6029. *!               : GENDEFAULT         (procedure in GENSCRN.PRG)
  6030. *!               : ELEMRANGE          (procedure in GENSCRN.PRG)
  6031. *!               : ANYWHEN            (procedure in GENSCRN.PRG)
  6032. *!               : ANYVALID           (procedure in GENSCRN.PRG)
  6033. *!               : ANYDISABLED        (procedure in GENSCRN.PRG)
  6034. *!               : ANYMESSAGE         (procedure in GENSCRN.PRG)
  6035. *!               : ANYERROR           (procedure in GENSCRN.PRG)
  6036. *!               : ANYFONT            (procedure in GENSCRN.PRG)
  6037. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  6038. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  6039. *!
  6040. *!*****************************************************************************
  6041. PROCEDURE genspinner
  6042. *)
  6043. *) GENSPINNER - Generate Spinners
  6044. *)
  6045. *) Description:
  6046. *) Generate code to display spinners exactly as they appear
  6047. *) in the painted screen(s).
  6048. *)
  6049. PRIVATE m.thepicture
  6050.  
  6051. m.thepicture = PICTURE
  6052. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  6053.    SET DECIMALS TO 3
  6054. ENDIF
  6055.  
  6056. \@ <<Vpos>>,<<Hpos>> GET <<Name>> ;
  6057. \    SPINNER
  6058.  
  6059. ** Generate the increment value
  6060. IF !EMPTY(initialval)
  6061.    IF INT(VAL(initialval)) <> VAL(initialval)
  6062.       SET DECIMALS TO LEN(initialval) - AT('.',initialval)
  6063.    ENDIF
  6064.    \\ <<VAL(Initialval)>>
  6065.    SET DECIMALS TO 3
  6066. ELSE
  6067.    \\ 1.000
  6068. ENDIF
  6069.  
  6070. ** Generate the minimum value.
  6071. IF !EMPTY(TAG)
  6072.    \\, <<Tag>>
  6073. ELSE
  6074.    IF !EMPTY(tag2)
  6075.       \\,
  6076.    ENDIF
  6077. ENDIF
  6078.  
  6079. ** Generate the maximum value.
  6080. IF !EMPTY(tag2)
  6081.    \\, <<Tag2>>
  6082. ENDIF
  6083. \\ ;
  6084.  
  6085. IF !EMPTY(m.thepicture)
  6086.    \    PICTURE
  6087.    DO choppicture WITH m.thepicture
  6088.    \\ ;
  6089. ENDIF
  6090. \    SIZE <<Height>>, <<Width>>
  6091.  
  6092. ** Put out a default which corresponds to the range of valid values.
  6093. DO CASE
  6094. CASE !EMPTY(TAG)
  6095.    \\ ;
  6096.    \    DEFAULT <<VAL(Tag)>>
  6097. CASE !EMPTY(tag2)
  6098.    \\ ;
  6099.    \    DEFAULT <<VAL(Tag2)>>
  6100. CASE EMPTY(TRIM(initialval))
  6101.    \\ ;
  6102.    \    DEFAULT 1
  6103. OTHERWISE
  6104.    DO gendefault
  6105. ENDCASE
  6106.  
  6107. DO elemrange
  6108. DO anywhen
  6109. DO anyvalid
  6110. DO anydisabled
  6111. DO anymessage
  6112. DO anyerror
  6113. SET DECIMALS TO 0
  6114. DO anyfont
  6115. DO anystyle
  6116. DO anyscheme
  6117. RETURN
  6118.  
  6119. *!*****************************************************************************
  6120. *!
  6121. *!      Procedure: FROMPOPUP
  6122. *!
  6123. *!      Called by: GENLIST            (procedure in GENSCRN.PRG)
  6124. *!
  6125. *!*****************************************************************************
  6126. PROCEDURE frompopup
  6127. *)
  6128. *) FROMPOPUP - Generate code for scrollable list defined from a popup.
  6129. *)
  6130. *) Description:
  6131. *) Generate POPUP <popup name> code as part of a scrollable list
  6132. *) definition.  Popup name may either be name explicitly provided by
  6133. *) the user or a unique name generated by SYS(2015) function.
  6134. *)
  6135. PRIVATE m.start, m.pos
  6136. \    POPUP
  6137. IF STYLE < 2
  6138.    IF NOT EMPTY(expr)
  6139.       \\ <<Expr>> ;
  6140.    ENDIF
  6141. ELSE
  6142.    m.start = 1
  6143.    m.pos   = 0
  6144.    DO WHILE .T.
  6145.       m.pos = ASCAN(g_popups, m.dbalias, m.start)
  6146.       IF g_popups[m.pos+1] = RECNO()
  6147.          EXIT
  6148.       ENDIF
  6149.       m.start = m.pos + 3
  6150.    ENDDO
  6151.    \\ <<g_popups[m.pos+2]>> ;
  6152. ENDIF
  6153.  
  6154. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  6155.    SET DECIMALS TO 3
  6156. ENDIF
  6157. \    SIZE <<Height>>,<<Width>> ;
  6158. \    DEFAULT " "
  6159. SET DECIMALS TO 0
  6160. RETURN
  6161.  
  6162. *!*****************************************************************************
  6163. *!
  6164. *!      Procedure: GENPOPUP
  6165. *!
  6166. *!      Called by: BUILDFMT           (procedure in GENSCRN.PRG)
  6167. *!
  6168. *!          Calls: ELEMRANGE          (procedure in GENSCRN.PRG)
  6169. *!               : ANYFONT            (procedure in GENSCRN.PRG)
  6170. *!               : ANYSTYLE           (procedure in GENSCRN.PRG)
  6171. *!               : ANYWHEN            (procedure in GENSCRN.PRG)
  6172. *!               : ANYVALID           (procedure in GENSCRN.PRG)
  6173. *!               : ANYDISABLED        (procedure in GENSCRN.PRG)
  6174. *!               : ANYMESSAGE         (procedure in GENSCRN.PRG)
  6175. *!               : ANYERROR           (procedure in GENSCRN.PRG)
  6176. *!               : ANYSCHEME          (procedure in GENSCRN.PRG)
  6177. *!
  6178. *!*****************************************************************************
  6179. PROCEDURE genpopup
  6180. *)
  6181. *) GENPOPUP - Generate Popups.
  6182. *)
  6183. *) Description:
  6184. *) Generate code to display popups exactly as they appear in the
  6185. *) painted screen(s).
  6186. *)
  6187. PRIVATE m.thepicture, m.theinitval
  6188.  
  6189. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  6190.    SET DECIMALS TO 3
  6191. ENDIF
  6192. \@ <<Vpos>>,<<Hpos>> GET <<Name>> ;
  6193. IF objcode = c_sgget
  6194.    m.thepicture = PICTURE
  6195.    m.theinitval = initialval
  6196.    \    PICTURE <<m.thepicture>> ;
  6197.    \    SIZE <<Height>>,<<Width>> ;
  6198.    \    DEFAULT <<IIF(EMPTY(m.theinitval), '" "', m.theinitval)>>
  6199. ELSE
  6200.     * e.g., popup from array
  6201.    \    PICTURE "<<ctrlclause(picture)>>" ;
  6202.    \    FROM <<Expr>> ;
  6203.    \    SIZE <<Height>>,<<Width>>
  6204.    DO elemrange
  6205.    \\ ;
  6206.    \    DEFAULT 1
  6207. ENDIF
  6208. SET DECIMALS TO 0
  6209.  
  6210. DO anyfont
  6211. DO anystyle
  6212. DO anywhen
  6213. DO anyvalid
  6214. DO anydisabled
  6215. DO anymessage
  6216. DO anyerror
  6217. DO anyscheme
  6218. RETURN
  6219.  
  6220. *!*****************************************************************************
  6221. *!
  6222. *!      Procedure: ELEMRANGE
  6223. *!
  6224. *!      Called by: GENFIELDS          (procedure in GENSCRN.PRG)
  6225. *!               : GENLIST            (procedure in GENSCRN.PRG)
  6226. *!               : GENSPINNER         (procedure in GENSCRN.PRG)
  6227. *!               : GENPOPUP           (procedure in GENSCRN.PRG)
  6228. *!
  6229. *!          Calls: ADDTOCTRL          (procedure in GENSCRN.PRG)
  6230. *!
  6231. *!*****************************************************************************
  6232. PROCEDURE elemrange
  6233. *)
  6234. *) ELEMRANGE - Element range clause for popup and scrollable list
  6235. *)                defined form an array.
  6236. *)
  6237. PRIVATE m.firstelem, m.genericname
  6238. m.firstelem = .F.
  6239. IF NOT EMPTY(rangelo)
  6240.    m.firstelem = .T.
  6241.    \\ ;
  6242.    \    RANGE
  6243.    IF lotype = 0
  6244.       \\ <<ALLTRIM(CHRTRAN(Rangelo,CHR(13)+CHR(10),""))>>
  6245.    ELSE
  6246.       m.genericname = LOWER(SYS(2015))
  6247.       \\ <<m.genericname>>()
  6248.       DO CASE
  6249.       CASE objtype = c_otfield
  6250.          DO addtoctrl WITH m.genericname, "GET Low RANGE", rangelo, name
  6251.       CASE objtype = c_otspinner
  6252.          DO addtoctrl WITH m.genericname, "SPINNER Low RANGE", rangelo, name
  6253.       OTHERWISE
  6254.          DO addtoctrl WITH m.genericname, "Popup From", rangelo, name
  6255.       ENDCASE
  6256.    ENDIF
  6257. ENDIF
  6258. IF NOT EMPTY(rangehi)
  6259.    IF NOT m.firstelem
  6260.       \\ ;
  6261.       \    RANGE ,
  6262.    ELSE
  6263.       \\,
  6264.    ENDIF
  6265.    IF hitype = 0
  6266.       \\ <<CHRTRAN(ALLTRIM(Rangehi),CHR(13)+CHR(10),"")>>
  6267.    ELSE
  6268.       m.genericname = LOWER(SYS(2015))
  6269.       \\ <<m.genericname>>()
  6270.       DO CASE
  6271.       CASE objtype = c_otfield
  6272.          DO addtoctrl WITH m.genericname, "GET High RANGE", rangehi, name
  6273.       CASE objtype = c_otspinner
  6274.          DO addtoctrl WITH m.genericname, "SPINNER High RANGE", rangehi, name
  6275.       OTHERWISE
  6276.          DO addtoctrl WITH m.genericname, "Popup From", rangehi, name
  6277.       ENDCASE
  6278.    ENDIF
  6279. ENDIF
  6280. RETURN
  6281.  
  6282. *!*****************************************************************************
  6283. *!
  6284. *!      Procedure: GENACTWINDOW
  6285. *!
  6286. *!      Called by: ANYWINDOWS         (procedure in GENSCRN.PRG)
  6287. *!
  6288. *!*****************************************************************************
  6289. PROCEDURE genactwindow
  6290. *)
  6291. *) GENACTWINDOW - Generate Activate Window Command.
  6292. *)
  6293. *) Description:
  6294. *) Generate the ACTIVATE WINDOW... command.
  6295. *)
  6296. PARAMETER m.cnt
  6297. IF !m.g_noreadplain
  6298.    IF m.g_lastwindow == g_screens[m.cnt,2]
  6299.       \@ 0,0 CLEAR
  6300.    ENDIF
  6301.    IF m.g_multreads
  6302.       \ACTIVATE WINDOW <<g_screens[m.cnt,2]>>
  6303.       RETURN
  6304.    ENDIF
  6305.  
  6306.    \IF WVISIBLE("<<g_screens[m.cnt,2]>>")
  6307.    \    ACTIVATE WINDOW <<g_screens[m.cnt,2]>> SAME
  6308.    \ELSE
  6309.    \    ACTIVATE WINDOW <<g_screens[m.cnt,2]>> NOSHOW
  6310.    \ENDIF
  6311. ENDIF
  6312. RETURN
  6313.  
  6314. *!*****************************************************************************
  6315. *!
  6316. *!      Procedure: GENDEFAULT
  6317. *!
  6318. *!      Called by: GENFIELDS          (procedure in GENSCRN.PRG)
  6319. *!               : GENTXTRGN          (procedure in GENSCRN.PRG)
  6320. *!               : GENSPINNER         (procedure in GENSCRN.PRG)
  6321. *!
  6322. *!*****************************************************************************
  6323. PROCEDURE gendefault
  6324. *)
  6325. *) GENDEFAULT - Generate Default Clause.
  6326. *)
  6327. PRIVATE m.theinitval
  6328. IF EMPTY(TRIM(initialval)) AND EMPTY(fillchar)
  6329.    RETURN
  6330. ENDIF
  6331. \\ ;
  6332. \    DEFAULT
  6333. IF EMPTY(TRIM(initialval))
  6334.    DO CASE
  6335.    CASE fillchar = "D"
  6336.       \\ {  /  /  }
  6337.    CASE fillchar = "C" OR fillchar = "M" OR fillchar = "G"
  6338.       \\ " "
  6339.    CASE fillchar = "L"
  6340.       \\ .F.
  6341.    CASE fillchar = "N"
  6342.       \\ 0
  6343.    CASE fillchar = "F"
  6344.       \\ 0.0
  6345.    ENDCASE
  6346. ELSE
  6347.    m.theinitval = initialval
  6348.    \\ <<ALLTRIM(m.theinitval)>>
  6349. ENDIF
  6350. RETURN
  6351.  
  6352. **
  6353. **  Procedures Generating Various Clauses for Screen Objects
  6354. **
  6355.  
  6356. *!*****************************************************************************
  6357. *!
  6358. *!      Procedure: ANYBITMAPCTRL
  6359. *!
  6360. *!      Called by: GENPUSH            (procedure in GENSCRN.PRG)
  6361. *!               : GENRADBUT          (procedure in GENSCRN.PRG)
  6362. *!               : GENCHKBOX          (procedure in GENSCRN.PRG)
  6363. *!
  6364. *!          Calls: FINDRELPATH()      (function  in GENSCRN.PRG)
  6365. *!               : CHOPPICTURE        (procedure in GENSCRN.PRG)
  6366. *!
  6367. *!*****************************************************************************
  6368. PROCEDURE anybitmapctrl
  6369. *)
  6370. *) ANYBITMAPCTRL - Parse the picture clause for a bitmap control (Push button, radio button, checkbox) and return it
  6371. *)        with LOCAFILE and a relative path in place of each absolute path.
  6372. *)
  6373. PARAMETER m.picture
  6374. PRIVATE m.name, m.relpath, m.count
  6375.  
  6376. IF AT("B", SUBSTR(m.picture,1, AT(" ",m.picture))) <> 0
  6377.    \    PICTURE <<LEFT(m.picture, AT(" ",m.picture))>>"
  6378.  
  6379.    m.picture = SUBSTR(m.picture, AT(" ", m.picture)+1)
  6380.    m.picture = LEFT(m.picture, LEN(m.picture)-1)
  6381.    m.count = 0
  6382.  
  6383.    DO WHILE LEN(m.picture) <> 0
  6384.       m.count = m.count + 1
  6385.       IF AT(";", m.picture) <> 0
  6386.          m.name = LEFT(m.picture, AT(";", m.picture)-1)
  6387.          m.picture = SUBSTR(m.picture, AT(";",m.picture)+1)
  6388.       ELSE
  6389.          m.name = m.picture
  6390.          m.picture = ""
  6391.       ENDIF
  6392.  
  6393.       m.relpath = LOWER(findrelpath(m.name))
  6394.  
  6395.       IF m.count = 1
  6396.          \\ + ;
  6397.       ELSE
  6398.          \\ + ";" + ;
  6399.       ENDIF
  6400.         IF EMPTY(justext(m.relpath))
  6401.            m.relpath = m.relpath + "."
  6402.         ENDIF
  6403.       \        (LOCFILE("<<m.relpath>>",<<bitmapstr(c_all)>>,"Where is <<basename(m.relpath)>>?"
  6404.         IF _MAC
  6405.             \\,"PICT"
  6406.         ENDIF
  6407.         \\))
  6408.    ENDDO
  6409.  
  6410.    \\ ;
  6411. ELSE
  6412.    \    PICTURE
  6413.    DO choppicture WITH m.picture
  6414.    \\ ;
  6415. ENDIF
  6416. RETURN
  6417.  
  6418. *!*****************************************************************************
  6419. *!
  6420. *!      Procedure: CHOPPICTURE
  6421. *!
  6422. *!      Called by: GENLIST            (procedure in GENSCRN.PRG)
  6423. *!               : GENSPINNER         (procedure in GENSCRN.PRG)
  6424. *!               : ANYBITMAPCTRL      (procedure in GENSCRN.PRG)
  6425. *!
  6426. *!*****************************************************************************
  6427. PROCEDURE choppicture
  6428. *)
  6429. *) CHOPPICTURE - Breaks a Picture clause into multiple 250 character segments to avoid
  6430. *)        the maximum string length limit.
  6431. *)
  6432. PARAMETER m.pict
  6433. PRIVATE m.quotechar, m.first
  6434. m.quotechar = LEFT(m.pict,1)
  6435. m.first = .T.
  6436.  
  6437. DO WHILE LEN(m.pict) > 250
  6438.    IF m.first
  6439.       \\ <<LEFT(m.pict,250) + m.quotechar>> + ;
  6440.       m.first = .F.
  6441.    ELSE
  6442.       \        <<LEFT(m.pict,250) + m.quotechar>> + ;
  6443.    ENDIF
  6444.    m.pict = m.quotechar + SUBSTR(m.pict,251)
  6445. ENDDO
  6446.  
  6447. IF m.first
  6448.    \\ <<m.pict>>
  6449. ELSE
  6450.    \    <<m.pict>>
  6451. ENDIF
  6452. RETURN
  6453.  
  6454. *!*****************************************************************************
  6455. *!
  6456. *!      Procedure: ANYDISABLED
  6457. *!
  6458. *!      Called by: GENFIELDS          (procedure in GENSCRN.PRG)
  6459. *!               : GENINVBUT          (procedure in GENSCRN.PRG)
  6460. *!               : GENTXTRGN          (procedure in GENSCRN.PRG)
  6461. *!               : GENPUSH            (procedure in GENSCRN.PRG)
  6462. *!               : GENRADBUT          (procedure in GENSCRN.PRG)
  6463. *!               : GENCHKBOX          (procedure in GENSCRN.PRG)
  6464. *!               : GENLIST            (procedure in GENSCRN.PRG)
  6465. *!               : GENSPINNER         (procedure in GENSCRN.PRG)
  6466. *!               : GENPOPUP           (procedure in GENSCRN.PRG)
  6467. *!
  6468. *!*****************************************************************************
  6469. PROCEDURE anydisabled
  6470. *)
  6471. *) ANYDISABLED - Place ENABLE/DISABLE clause.
  6472. *)
  6473. IF disabled
  6474.    \\ ;
  6475.    \    DISABLE
  6476. ENDIF
  6477. RETURN
  6478.  
  6479. *!*****************************************************************************
  6480. *!
  6481. *!      Procedure: ANYPICTURE
  6482. *!
  6483. *!      Called by: PLACESAYS          (procedure in GENSCRN.PRG)
  6484. *!               : GENTEXT            (procedure in GENSCRN.PRG)
  6485. *!               : GENFIELDS          (procedure in GENSCRN.PRG)
  6486. *!               : GENTXTRGN          (procedure in GENSCRN.PRG)
  6487. *!
  6488. *!*****************************************************************************
  6489. PROCEDURE anypicture
  6490. *)
  6491. *) ANYPICTURE
  6492. *)
  6493. PRIVATE m.string, m.expr_pos, m.newstring
  6494. IF NOT EMPTY(PICTURE) AND PICTURE <> '" "'
  6495.    \\ ;
  6496.    m.string = SUBSTR(PICTURE,2)   && drop opening quotation mark
  6497.    DO CASE
  6498.    CASE SUBSTR(m.string,1,1) = m.g_itse
  6499.       \    PICTURE <<SUBSTR(m.string,2,RAT(LEFT(picture,1),m.string)-2)>>
  6500.    CASE hasexpr(m.string) > 0 && an #ITSEXPRESSION character somewhere in the middle
  6501.        m.expr_pos = hasexpr(picture)
  6502.        * Emit the first part of the PICTURE
  6503.        \    PICTURE <<LEFT(picture,expr_pos-1)>>
  6504.        * Emit a closing quotation mark, which will be the same as the opening one
  6505.        \\<<LEFT(picture,1)>>
  6506.        * Now emit the expression portion of the picture clause, not including a closing quote
  6507.        \\ + <<SUBSTR(picture,expr_pos+1,LEN(picture)-expr_pos-1))>>
  6508.    OTHERWISE
  6509.       \    PICTURE <<Picture>>
  6510.    ENDCASE
  6511. ENDIF
  6512.  
  6513.  
  6514. FUNCTION hasexpr
  6515. PARAMETER m.thepicture
  6516. RETURN ATC(m.g_itse,m.thepicture)
  6517.  
  6518. *!*****************************************************************************
  6519. *!
  6520. *!      Procedure: ANYSCROLL
  6521. *!
  6522. *!      Called by: GENTXTRGN          (procedure in GENSCRN.PRG)
  6523. *!
  6524. *!*****************************************************************************
  6525. PROCEDURE anyscroll
  6526. *)
  6527. *) ANYSCROLL - Place Scroll clause if applicable.
  6528. *)
  6529. IF scrollbar
  6530.    \\ ;
  6531.    \    SCROLL
  6532. ENDIF
  6533. RETURN
  6534.  
  6535. *!*****************************************************************************
  6536. *!
  6537. *!      Procedure: ANYTAB
  6538. *!
  6539. *!      Called by: GENTXTRGN          (procedure in GENSCRN.PRG)
  6540. *!
  6541. *!*****************************************************************************
  6542. PROCEDURE anytab
  6543. *)
  6544. *) ANYTAB - Place Tab clause on an @...EDIT command.
  6545. *)
  6546. IF TAB
  6547.    \\ ;
  6548.    \    TAB
  6549. ENDIF
  6550. RETURN
  6551.  
  6552. *!*****************************************************************************
  6553. *!
  6554. *!      Procedure: ANYFONT
  6555. *!
  6556. *!      Called by: PLACESAYS          (procedure in GENSCRN.PRG)
  6557. *!               : GENDESKTOP         (procedure in GENSCRN.PRG)
  6558. *!               : GENWINDEFI         (procedure in GENSCRN.PRG)
  6559. *!               : GENTEXT            (procedure in GENSCRN.PRG)
  6560. *!               : GENFIELDS          (procedure in GENSCRN.PRG)
  6561. *!               : GENINVBUT          (procedure in GENSCRN.PRG)
  6562. *!               : GENTXTRGN          (procedure in GENSCRN.PRG)
  6563. *!               : GENPUSH            (procedure in GENSCRN.PRG)
  6564. *!               : GENRADBUT          (procedure in GENSCRN.PRG)
  6565. *!               : GENCHKBOX          (procedure in GENSCRN.PRG)
  6566. *!               : GENLIST            (procedure in GENSCRN.PRG)
  6567. *!               : GENSPINNER         (procedure in GENSCRN.PRG)
  6568. *!               : GENPOPUP           (procedure in GENSCRN.PRG)
  6569. *!
  6570. *!*****************************************************************************
  6571. PROCEDURE anyfont
  6572. *)
  6573. *) ANYFONT - Place font clause on an object if in a graphical
  6574. *)        environment
  6575. *)
  6576. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  6577.    \\ ;
  6578.    \    FONT "<<Fontface>>", <<Fontsize>>
  6579. ENDIF
  6580. RETURN
  6581.  
  6582. *!*****************************************************************************
  6583. *!
  6584. *!      Procedure: ANYSTYLE
  6585. *!
  6586. *!      Called by: PLACESAYS          (procedure in GENSCRN.PRG)
  6587. *!               : GENDESKTOP         (procedure in GENSCRN.PRG)
  6588. *!               : GENWINDEFI         (procedure in GENSCRN.PRG)
  6589. *!               : GENBOXES           (procedure in GENSCRN.PRG)
  6590. *!               : GENLINES           (procedure in GENSCRN.PRG)
  6591. *!               : GENTEXT            (procedure in GENSCRN.PRG)
  6592. *!               : GENFIELDS          (procedure in GENSCRN.PRG)
  6593. *!               : GENINVBUT          (procedure in GENSCRN.PRG)
  6594. *!               : GENTXTRGN          (procedure in GENSCRN.PRG)
  6595. *!               : GENPUSH            (procedure in GENSCRN.PRG)
  6596. *!               : GENRADBUT          (procedure in GENSCRN.PRG)
  6597. *!               : GENCHKBOX          (procedure in GENSCRN.PRG)
  6598. *!               : GENLIST            (procedure in GENSCRN.PRG)
  6599. *!               : GENPICTURE         (procedure in GENSCRN.PRG)
  6600. *!               : GENSPINNER         (procedure in GENSCRN.PRG)
  6601. *!               : GENPOPUP           (procedure in GENSCRN.PRG)
  6602. *!
  6603. *!*****************************************************************************
  6604. PROCEDURE anystyle
  6605. *)
  6606. *) ANYSTYLE - Place a Style clause in an object.
  6607. *)
  6608. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  6609.    IF NOT EMPTY(fontstyle) OR mode != 0 OR ;
  6610.          (NOT EMPTY(STYLE) AND objtype != c_otscreen AND ;
  6611.          objtype != c_ottext )
  6612.       \\ ;
  6613.       \    STYLE "
  6614.         \\<<num2style(fontstyle)>>
  6615.  
  6616.         * Is it transparent?
  6617.       IF mode = 1
  6618.          \\T
  6619.       ENDIF
  6620.  
  6621.       IF NOT EMPTY(STYLE) AND objtype != c_otscreen AND ;
  6622.             objtype != c_otlist AND objtype != c_ottext AND ;
  6623.                         objtype != c_otpicture
  6624.          \\<<Style>>
  6625.       ENDIF
  6626.       \\"
  6627.    ENDIF
  6628. ENDIF
  6629. RETURN
  6630.  
  6631. *!*****************************************************************************
  6632. *!
  6633. *!      Procedure: ANYPATTERN
  6634. *!
  6635. *!      Called by: GENBOXES           (procedure in GENSCRN.PRG)
  6636. *!
  6637. *!*****************************************************************************
  6638. PROCEDURE anypattern
  6639. *)
  6640. *) ANYPATTERN - Place a PATTERN clause for boxes.
  6641. *)
  6642. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  6643.    IF fillpat != 0
  6644.       \\ ;
  6645.       \    PATTERN <<Fillpat>>
  6646.    ENDIF
  6647. ENDIF
  6648. RETURN
  6649.  
  6650. *!*****************************************************************************
  6651. *!
  6652. *!      Procedure: ANYSCHEME
  6653. *!
  6654. *!      Called by: PLACESAYS          (procedure in GENSCRN.PRG)
  6655. *!               : GENDESKTOP         (procedure in GENSCRN.PRG)
  6656. *!               : GENWINDEFI         (procedure in GENSCRN.PRG)
  6657. *!               : GENBOXES           (procedure in GENSCRN.PRG)
  6658. *!               : GENLINES           (procedure in GENSCRN.PRG)
  6659. *!               : GENTEXT            (procedure in GENSCRN.PRG)
  6660. *!               : GENFIELDS          (procedure in GENSCRN.PRG)
  6661. *!               : GENINVBUT          (procedure in GENSCRN.PRG)
  6662. *!               : GENTXTRGN          (procedure in GENSCRN.PRG)
  6663. *!               : GENPUSH            (procedure in GENSCRN.PRG)
  6664. *!               : GENRADBUT          (procedure in GENSCRN.PRG)
  6665. *!               : GENCHKBOX          (procedure in GENSCRN.PRG)
  6666. *!               : GENLIST            (procedure in GENSCRN.PRG)
  6667. *!               : GENSPINNER         (procedure in GENSCRN.PRG)
  6668. *!               : GENPOPUP           (procedure in GENSCRN.PRG)
  6669. *!
  6670. *!*****************************************************************************
  6671. PROCEDURE anyscheme
  6672. *)
  6673. *) ANYSCHEME - Place Color Scheme clause if applicable.
  6674. *)
  6675.  
  6676. IF NOT EMPTY(colorpair)
  6677.    \\ ;
  6678.    \    COLOR <<Colorpair>>
  6679.    RETURN
  6680. ENDIF
  6681. IF SCHEME <> 0
  6682.    \\ ;
  6683.    \    COLOR SCHEME <<Scheme>>
  6684.    IF objtype = c_otpopup AND scheme2<>0
  6685.       \\, <<Scheme2>>
  6686.    ENDIF
  6687. ELSE
  6688.    IF m.g_defasch2 <> 0
  6689.       DO CASE
  6690.       CASE objtype = c_ottext AND HEIGHT > 1
  6691.          \\ ;
  6692.          \    COLOR SCHEME <<m.g_defasch2>>
  6693.       CASE objtype = c_otlist
  6694.          \\ ;
  6695.          \    COLOR SCHEME <<m.g_defasch2>>
  6696.       CASE objtype = c_otpopup
  6697.          \\ ;
  6698.          \    COLOR SCHEME <<m.g_defasch1>>, <<m.g_defasch2>>
  6699.       ENDCASE
  6700.    ELSE
  6701.       IF (g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC' ) ;
  6702.             AND ((ObjTYpe = c_otscreen AND fillred >=0) ;
  6703.              OR (ObjType <> c_otscreen AND (penred >= 0 OR fillred >= 0)) )
  6704.          m.ctrlflag = .F.   && .T. if this is a control-type object (e.g., radio button)
  6705.          \\ ;
  6706.          \    COLOR
  6707.          DO CASE
  6708.          CASE INLIST(objtype,c_otfield,c_otspinner)
  6709.             ** Field or spinner - color pair 2
  6710.             DO CASE
  6711.             CASE objcode = c_sgget OR objcode = c_sgedit
  6712.                \\ ,RGB(
  6713.             CASE objcode = c_sgsay
  6714.                \\ RGB(
  6715.             CASE objcode = c_sgfrom
  6716.                \\ ,,,,,,,,RGB(
  6717.             ENDCASE
  6718.  
  6719.          CASE objtype = c_otlist
  6720.             m.ctrlflag = .T.    && remember that this is a control object
  6721.             \\ RGB(
  6722.  
  6723.  
  6724.          CASE objtype = c_ottext OR objtype = c_otscreen OR ;
  6725.                objtype = c_otbox OR objtype = c_otline
  6726.             ** Text, Box, Line, or Screen - color pair 1
  6727.             \\ RGB(
  6728.  
  6729.          OTHERWISE
  6730.             m.ctrlflag = .T.    && remember that this is a control object
  6731.             \\ ,,,,,,,,RGB(
  6732.          ENDCASE
  6733.  
  6734.          IF penred >= 0
  6735.             \\<<Penred>>,<<Pengreen>>,<<Penblue>>,
  6736.          ELSE
  6737.             \\,,,
  6738.          ENDIF
  6739.          IF fillred >= 0
  6740.             \\<<Fillred>>,<<Fillgreen>>,<<Fillblue>>)
  6741.          ELSE
  6742.             \\,,,)
  6743.          ENDIF
  6744.  
  6745.          IF m.ctrlflag AND INLIST(objtype, c_otradbut, c_otchkbox, c_otpopup,c_otlist)
  6746.             * Add one more RGB clause to control the disabled colors for control
  6747.             * objects such as radio buttons, check boxes, popups, etc.
  6748.             \\,RGB(
  6749.             IF penred >= 0
  6750.                \\<<Penred>>,<<Pengreen>>,<<Penblue>>,
  6751.             ELSE
  6752.                \\,,,
  6753.             ENDIF
  6754.             IF fillred >= 0
  6755.                \\<<Fillred>>,<<Fillgreen>>,<<Fillblue>>)
  6756.             ELSE
  6757.                \\,,,)
  6758.             ENDIF
  6759.          ENDIF
  6760.       ENDIF
  6761.    ENDIF
  6762. ENDIF
  6763. RETURN
  6764.  
  6765. *!*****************************************************************************
  6766. *!
  6767. *!      Procedure: ANYPEN
  6768. *!
  6769. *!      Called by: GENBOXES           (procedure in GENSCRN.PRG)
  6770. *!               : GENLINES           (procedure in GENSCRN.PRG)
  6771. *!
  6772. *!*****************************************************************************
  6773. PROCEDURE anypen
  6774. *)
  6775. *) ANYPEN - Place Color Scheme clause if applicable.
  6776. *)
  6777. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  6778.    \\ ;
  6779.    \    PEN <<Pensize>>, <<Penpat>>
  6780. ENDIF
  6781. RETURN
  6782.  
  6783. *!*****************************************************************************
  6784. *!
  6785. *!      Procedure: ANYVALID
  6786. *!
  6787. *!      Called by: GENFIELDS          (procedure in GENSCRN.PRG)
  6788. *!               : GENINVBUT          (procedure in GENSCRN.PRG)
  6789. *!               : GENTXTRGN          (procedure in GENSCRN.PRG)
  6790. *!               : GENPUSH            (procedure in GENSCRN.PRG)
  6791. *!               : GENRADBUT          (procedure in GENSCRN.PRG)
  6792. *!               : GENCHKBOX          (procedure in GENSCRN.PRG)
  6793. *!               : GENLIST            (procedure in GENSCRN.PRG)
  6794. *!               : GENSPINNER         (procedure in GENSCRN.PRG)
  6795. *!               : GENPOPUP           (procedure in GENSCRN.PRG)
  6796. *!
  6797. *!          Calls: GETCNAME()         (function  in GENSCRN.PRG)
  6798. *!               : ADDTOCTRL          (procedure in GENSCRN.PRG)
  6799. *!
  6800. *!*****************************************************************************
  6801. PROCEDURE anyvalid
  6802. *)
  6803. *) ANYVALID - Place Valid clause if applicable.
  6804. *)
  6805. PRIVATE m.genericname, m.valid
  6806. IF NOT EMPTY(VALID)
  6807.    \\ ;
  6808.    IF validtype = 0
  6809.       m.valid = VALID
  6810.       \    VALID <<stripcr(m.valid)>>
  6811.    ELSE
  6812.       m.genericname = getcname(VALID)
  6813.       \    VALID <<m.genericname>>()
  6814.       DO addtoctrl WITH m.genericname, "VALID", VALID, name
  6815.    ENDIF
  6816. ENDIF
  6817.  
  6818. *!*****************************************************************************
  6819. *!
  6820. *!      Procedure: ANYTITLEORFOOTER
  6821. *!
  6822. *!      Called by: GENDESKTOP         (procedure in GENSCRN.PRG)
  6823. *!               : GENWINDEFI         (procedure in GENSCRN.PRG)
  6824. *!
  6825. *!*****************************************************************************
  6826. PROCEDURE anytitleorfooter
  6827. *)
  6828. *) ANYTITLEORFOOTER - Place Window Title/Footer clause.
  6829. *)
  6830. PRIVATE m.string, m.thetag
  6831. IF NOT EMPTY(TAG)
  6832.    \\ ;
  6833.    m.string = SUBSTR(TAG,2)
  6834.    IF SUBSTR(m.string,1,1) = m.g_itse
  6835.       \    TITLE <<SUBSTR(m.string, 2, RAT('"',m.string)-2)>>
  6836.    ELSE
  6837.       m.thetag = TAG
  6838.       \    TITLE <<m.thetag>>
  6839.    ENDIF
  6840. ENDIF
  6841. IF NOT EMPTY(tag2)
  6842.    \\ ;
  6843.    m.string = SUBSTR(tag2,2)
  6844.    IF SUBSTR(m.string,1,1) = m.g_itse
  6845.       \    FOOTER <<SUBSTR(m.string, 2, RAT('"',m.string)-2)>>
  6846.    ELSE
  6847.       m.thetag = tag2
  6848.       \    FOOTER <<m.thetag>>
  6849.    ENDIF
  6850. ENDIF
  6851. RETURN
  6852.  
  6853.  
  6854. *!*****************************************************************************
  6855. *!
  6856. *!      Procedure: ANYWHEN
  6857. *!
  6858. *!      Called by: GENFIELDS          (procedure in GENSCRN.PRG)
  6859. *!               : GENINVBUT          (procedure in GENSCRN.PRG)
  6860. *!               : GENTXTRGN          (procedure in GENSCRN.PRG)
  6861. *!               : GENPUSH            (procedure in GENSCRN.PRG)
  6862. *!               : GENRADBUT          (procedure in GENSCRN.PRG)
  6863. *!               : GENCHKBOX          (procedure in GENSCRN.PRG)
  6864. *!               : GENLIST            (procedure in GENSCRN.PRG)
  6865. *!               : GENSPINNER         (procedure in GENSCRN.PRG)
  6866. *!               : GENPOPUP           (procedure in GENSCRN.PRG)
  6867. *!
  6868. *!          Calls: GETCNAME()         (function  in GENSCRN.PRG)
  6869. *!               : ADDTOCTRL          (procedure in GENSCRN.PRG)
  6870. *!
  6871. *!*****************************************************************************
  6872. PROCEDURE anywhen
  6873. *)
  6874. *) ANYWHEN - Place a When clause in a Get field.
  6875. *)
  6876. PRIVATE m.genericname, m.when
  6877. IF EMPTY(WHEN)
  6878.    RETURN
  6879. ENDIF
  6880. \\ ;
  6881. IF whentype = 0
  6882.    m.when = WHEN
  6883.    \    WHEN <<stripcr(m.when)>>
  6884. ELSE
  6885.    m.genericname = getcname(WHEN)
  6886.    \    WHEN <<m.genericname>>()
  6887.    DO addtoctrl WITH m.genericname, "WHEN", WHEN, name
  6888. ENDIF
  6889. RETURN
  6890.  
  6891. *!*****************************************************************************
  6892. *!
  6893. *!      Procedure: ANYMESSAGE
  6894. *!
  6895. *!      Called by: GENFIELDS          (procedure in GENSCRN.PRG)
  6896. *!               : GENINVBUT          (procedure in GENSCRN.PRG)
  6897. *!               : GENTXTRGN          (procedure in GENSCRN.PRG)
  6898. *!               : GENPUSH            (procedure in GENSCRN.PRG)
  6899. *!               : GENRADBUT          (procedure in GENSCRN.PRG)
  6900. *!               : GENCHKBOX          (procedure in GENSCRN.PRG)
  6901. *!               : GENLIST            (procedure in GENSCRN.PRG)
  6902. *!               : GENSPINNER         (procedure in GENSCRN.PRG)
  6903. *!               : GENPOPUP           (procedure in GENSCRN.PRG)
  6904. *!
  6905. *!          Calls: GETCNAME()         (function  in GENSCRN.PRG)
  6906. *!               : ADDTOCTRL          (procedure in GENSCRN.PRG)
  6907. *!
  6908. *!*****************************************************************************
  6909. PROCEDURE anymessage
  6910. *)
  6911. *) ANYMESSAGE - Place a message clause whenever appropriate.
  6912. *)
  6913. PRIVATE m.genericname, m.mess
  6914. IF EMPTY(MESSAGE)
  6915.    RETURN
  6916. ENDIF
  6917. \\ ;
  6918. IF messtype = 0
  6919.    m.mess = MESSAGE
  6920.    \    MESSAGE
  6921.    \\ <<stripcr(m.mess)>>
  6922. ELSE
  6923.    m.genericname = getcname(MESSAGE)
  6924.    \    MESSAGE <<m.genericname>>()
  6925.    DO addtoctrl WITH m.genericname, "MESSAGE", MESSAGE, name
  6926. ENDIF
  6927. RETURN
  6928.  
  6929. *!*****************************************************************************
  6930. *!
  6931. *!      Procedure: ANYERROR
  6932. *!
  6933. *!      Called by: GENFIELDS          (procedure in GENSCRN.PRG)
  6934. *!               : GENTXTRGN          (procedure in GENSCRN.PRG)
  6935. *!               : GENPUSH            (procedure in GENSCRN.PRG)
  6936. *!               : GENRADBUT          (procedure in GENSCRN.PRG)
  6937. *!               : GENCHKBOX          (procedure in GENSCRN.PRG)
  6938. *!               : GENLIST            (procedure in GENSCRN.PRG)
  6939. *!               : GENSPINNER         (procedure in GENSCRN.PRG)
  6940. *!               : GENPOPUP           (procedure in GENSCRN.PRG)
  6941. *!
  6942. *!          Calls: GETCNAME()         (function  in GENSCRN.PRG)
  6943. *!               : ADDTOCTRL          (procedure in GENSCRN.PRG)
  6944. *!
  6945. *!*****************************************************************************
  6946. PROCEDURE anyerror
  6947. *)
  6948. *) ANYERROR - Place an error clause whenever appropriate.
  6949. *)
  6950. PRIVATE m.genericname, m.err
  6951. IF EMPTY(ERROR)
  6952.    RETURN
  6953. ENDIF
  6954. \\ ;
  6955. IF errortype = 0
  6956.    m.err = ERROR
  6957.    \    ERROR
  6958.    \\ <<stripcr(m.err)>>
  6959. ELSE
  6960.    m.genericname = getcname(ERROR)
  6961.    \    ERROR <<m.genericname>>()
  6962.    DO addtoctrl WITH m.genericname, "ERROR", ERROR, name
  6963. ENDIF
  6964. RETURN
  6965.  
  6966. *!*****************************************************************************
  6967. *!
  6968. *!      Procedure: ANYFILL
  6969. *!
  6970. *!*****************************************************************************
  6971. PROCEDURE anyfill
  6972. *)
  6973. *) ANYFILL - Place the Fill clause whenever appropriate.
  6974. *)
  6975. IF fillchar <> c_null
  6976.    \\ ;
  6977.    \    FILL "<<Fillchar>>"
  6978. ENDIF
  6979. RETURN
  6980.  
  6981. *!*****************************************************************************
  6982. *!
  6983. *!      Procedure: ANYWINDOWCHARS
  6984. *!
  6985. *!      Called by: GENDESKTOP         (procedure in GENSCRN.PRG)
  6986. *!               : GENWINDEFI         (procedure in GENSCRN.PRG)
  6987. *!
  6988. *!*****************************************************************************
  6989. PROCEDURE anywindowchars
  6990. *)
  6991. *) ANYWINDOWCHARS - Place window characteristics options.
  6992. *)
  6993. *) Description:
  6994. *) Place the FLOAT, GROW, CLOSE, ZOOM, SHADOW, and MINIMIZE clauses
  6995. *) for a window painted by the user.
  6996. *)
  6997. \\ ;
  6998. \    <<IIF(Float, "FLOAT ;", "NOFLOAT ;")>>
  6999. \    <<IIF(Close, "CLOSE", "NOCLOSE")>>
  7000. IF SHADOW
  7001.    \\ ;
  7002.    \    SHADOW
  7003. ENDIF
  7004. IF m.g_genvers <> "MAC"
  7005.     IF MINIMIZE
  7006.        \\ ;
  7007.        \    MINIMIZE
  7008.     ELSE
  7009.        \\ ;
  7010.        \    NOMINIMIZE
  7011.     ENDIF
  7012. ENDIF
  7013. RETURN
  7014.  
  7015. *!*****************************************************************************
  7016. *!
  7017. *!      Procedure: ANYBORDER
  7018. *!
  7019. *!      Called by: GENDESKTOP         (procedure in GENSCRN.PRG)
  7020. *!               : GENWINDEFI         (procedure in GENSCRN.PRG)
  7021. *!
  7022. *!*****************************************************************************
  7023. PROCEDURE anyborder
  7024. *)
  7025. *) ANYBORDER - Place Border type clause on a box.
  7026. *)
  7027. *) Description:
  7028. *) Place border type clause on a box depending on the setting of
  7029. *) the field Border.
  7030. *)
  7031. IF BORDER<>1
  7032.    \\ ;
  7033. ENDIF
  7034.  
  7035. DO CASE
  7036. CASE BORDER = 0
  7037.    \    NONE
  7038. CASE BORDER = 2
  7039.    \    DOUBLE
  7040. CASE BORDER = 3
  7041.    \    PANEL
  7042. CASE BORDER = 4
  7043.    \    SYSTEM
  7044. ENDCASE
  7045. RETURN
  7046.  
  7047. *!*****************************************************************************
  7048. *!
  7049. *!      Procedure: ANYWALLPAPER
  7050. *!
  7051. *!      Called by: GENDESKTOP         (procedure in GENSCRN.PRG)
  7052. *!               : GENWINDEFI         (procedure in GENSCRN.PRG)
  7053. *!
  7054. *!          Calls: FINDRELPATH()      (function  in GENSCRN.PRG)
  7055. *!
  7056. *!*****************************************************************************
  7057. PROCEDURE anywallpaper
  7058. *)
  7059. *) ANYWALLPAPER - Place FILL FILE clause on any window.
  7060. *)
  7061. IF !EMPTY(PICTURE)
  7062.    m.relpath = findrelpath(SUBSTR(PICTURE, 2, LEN(PICTURE) - 2))
  7063.     IF !EMPTY(basename(m.relpath))
  7064.       \\ ;
  7065.       \    FILL FILE LOCFILE("<<m.relpath>>",<<bitmapstr(c_all)>>, ;
  7066.       \        "Where is <<LOWER(basename(m.relpath))>>?")
  7067.    ENDIF
  7068. ENDIF
  7069. RETURN
  7070.  
  7071. *!*****************************************************************************
  7072. *!
  7073. *!      Procedure: ANYICON
  7074. *!
  7075. *!      Called by: GENDESKTOP         (procedure in GENSCRN.PRG)
  7076. *!               : GENWINDEFI         (procedure in GENSCRN.PRG)
  7077. *!
  7078. *!          Calls: FINDRELPATH()      (function  in GENSCRN.PRG)
  7079. *!
  7080. *!*****************************************************************************
  7081. PROCEDURE anyicon
  7082. *)
  7083. *) ANYICON - Place ICON FILE clause on any window.
  7084. *)
  7085. IF !EMPTY(ORDER) AND ORDER <> '""'
  7086.    m.relpath = findrelpath(SUBSTR(ORDER, 2, LEN(ORDER) - 2))
  7087.     IF !EMPTY(basename(m.relpath))
  7088.       \\ ;
  7089.       \    ICON FILE LOCFILE("<<m.relpath>>","<<iconstr()>>", ;
  7090.       \        "Where is <<LOWER(basename(m.relpath))>>?")
  7091.    ENDIF
  7092. ENDIF
  7093. RETURN
  7094.  
  7095. *!*****************************************************************************
  7096. *!
  7097. *!      Procedure: WINDOWFROMTO
  7098. *!
  7099. *!      Called by: GENDESKTOP         (procedure in GENSCRN.PRG)
  7100. *!               : GETARRANGE         (procedure in GENSCRN.PRG)
  7101. *!
  7102. *!*****************************************************************************
  7103. PROCEDURE windowfromto
  7104. *)
  7105. *) WINDOWFROMTO - Place FROM...TO clause on any window.
  7106. *)
  7107. *) Description:
  7108. *) Place FROM...TO clause on any window designed in the screen
  7109. *) painter.  If window is to be centered, then adjust the coordinates
  7110. *) accordingly.
  7111. *)
  7112. PARAMETER m.xcoord, m.ycoord
  7113. IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  7114.    SET DECIMALS TO 3
  7115. ENDIF
  7116. IF PARAMETERS() = 0
  7117.    IF CENTER
  7118.       IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  7119.          \    AT  <<Vpos>>, <<Hpos>>  ;
  7120.          \    SIZE <<Height>>,<<Width>>
  7121.       ELSE
  7122.          \    FROM INT((SROW()-<<Height>>)/2),
  7123.          \\INT((SCOL()-<<Width>>)/2) ;
  7124.          \    TO INT((SROW()-<<Height>>)/2)+<<Height-1>>,
  7125.          \\INT((SCOL()-<<Width>>)/2)+<<Width-1>>
  7126.       ENDIF
  7127.    ELSE
  7128.       IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  7129.          \    AT <<Vpos>>, <<Hpos>> ;
  7130.          \    SIZE <<Height>>,<<Width>>
  7131.       ELSE
  7132.          \    FROM <<Vpos>>, <<Hpos>> ;
  7133.          \    TO <<Height+Vpos-1>>,<<Width+Hpos-1>>
  7134.       ENDIF
  7135.    ENDIF
  7136. ELSE
  7137.    IF g_screens[m.g_screen, 7] = 'WINDOWS' OR g_screens[m.g_screen, 7] = 'MAC'
  7138.       \    AT <<m.xcoord>>, <<m.ycoord>> ;
  7139.       \    SIZE <<Height>>,<<Width>>
  7140.    ELSE
  7141.       \    FROM <<m.xcoord>>, <<m.ycoord>> ;
  7142.       \    TO <<Height+m.xcoord-1>>,<<Width+m.ycoord-1>>
  7143.    ENDIF
  7144. ENDIF
  7145. SET DECIMALS TO 0
  7146. RETURN
  7147.  
  7148. **
  7149. ** Code Generating Documentation in Control and Format files.
  7150. **
  7151.  
  7152. *!*****************************************************************************
  7153. *!
  7154. *!      Procedure: HEADER
  7155. *!
  7156. *!      Called by: BUILDCTRL          (procedure in GENSCRN.PRG)
  7157. *!
  7158. *!*****************************************************************************
  7159. PROCEDURE HEADER
  7160. *)
  7161. *) HEADER - Generate application program's header.
  7162. *)
  7163. *) Description:
  7164. *) As a part of the application's header generate program name, name
  7165. *) of the author of the program, copyright notice, company name and
  7166. *) address, and the word 'Description:' which will be followed with
  7167. *) the application description generated by a separate procedure.
  7168. *)
  7169. IF LEN(_PRETEXT) <> 0
  7170.    \
  7171. ENDIF
  7172. \\*       <<m.g_corn1>><<SAFEREPL(m.g_horiz,57)>><<m.g_corn2>>
  7173. \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7174. \*       <<m.g_verti1>> <<DATE()>>
  7175. \\<<PADC(UPPER(ALLTRIM(strippath(m.g_outfile))),IIF(SET("CENTURY")="ON",35,37))," ")>>
  7176. \\  <<TIME()>> <<m.g_verti2>>
  7177. \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7178. \*       <<m.g_corn5>><<SAFEREPL(m.g_horiz,57)>><<m.g_corn6>>
  7179. \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7180. \*       <<m.g_verti1>> <<m.g_devauthor>>
  7181. \\<<SAFEREPL(" ",56-LEN(m.g_devauthor))>><<m.g_verti2>>
  7182. \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7183. \*       <<m.g_verti1>>
  7184. \\ Copyright (c) <<YEAR(DATE())>>
  7185. IF LEN(ALLTRIM(m.g_devcompany)) <= 36
  7186.    \\ <<ALLTRIM(m.g_devcompany)>>
  7187.    \\<<SAFEREPL(" ",37-LEN(ALLTRIM(m.g_devcompany)))>>
  7188.    \\<<m.g_verti2>>
  7189. ELSE
  7190.    \\ <<SAFEREPL(" ",37)>><<m.g_verti2>>
  7191.    \*       <<m.g_verti1>> <<m.g_devcompany>>
  7192.    \\<<SAFEREPL(" ",56-LEN(m.g_devcompany))>><<m.g_verti2>>
  7193. ENDIF
  7194. \*       <<m.g_verti1>> <<m.g_devaddress>>
  7195. \\<<SAFEREPL(" ",56-LEN(m.g_devaddress))>><<m.g_verti2>>
  7196.  
  7197. \*       <<m.g_verti1>> <<ALLTRIM(m.g_devcity)>>, <<m.g_devstate>>
  7198. \\  <<ALLTRIM(m.g_devzip)>>
  7199. \\<<SAFEREPL(" ",50-(LEN(ALLTRIM(m.g_devcity)+ALLTRIM(m.g_devzip))))>>
  7200. \\<<m.g_verti2>>
  7201.  
  7202. IF !INLIST(ALLTRIM(UPPER(m.g_devctry)),"USA","COUNTRY") AND !EMPTY(m.g_devctry)
  7203.    \*       <<m.g_verti1>> <<ALLTRIM(m.g_devctry)>>
  7204.    \\<<SAFEREPL(" ",50-(LEN(ALLTRIM(m.g_devctry))))>>
  7205.    \\<<m.g_verti2>>
  7206. ENDIF
  7207.  
  7208. \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7209. \*       <<m.g_verti1>> Description:
  7210. \\                                            <<m.g_verti2>>
  7211. \*       <<m.g_verti1>>
  7212. \\ This program was automatically generated by GENSCRN.
  7213. \\    <<m.g_verti2>>
  7214. \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7215. \*       <<m.g_corn3>><<SAFEREPL(m.g_horiz,57)>><<m.g_corn4>>
  7216. \
  7217. RETURN
  7218.  
  7219. *!*****************************************************************************
  7220. *!
  7221. *!      Procedure: GENFUNCHEADER
  7222. *!
  7223. *!      Called by: VALICLAUSE         (procedure in GENSCRN.PRG)
  7224. *!               : WHENCLAUSE         (procedure in GENSCRN.PRG)
  7225. *!               : ACTICLAUSE         (procedure in GENSCRN.PRG)
  7226. *!               : DEATCLAUSE         (procedure in GENSCRN.PRG)
  7227. *!               : SHOWCLAUSE         (procedure in GENSCRN.PRG)
  7228. *!               : ADDTOCTRL          (procedure in GENSCRN.PRG)
  7229. *!
  7230. *!*****************************************************************************
  7231. PROCEDURE genfuncheader
  7232. *)
  7233. *) GENFUNCHEADER - Generate Comment for Function/Procedure.
  7234. *)
  7235. PARAMETER m.procname, m.from, m.readlevel, m.varname
  7236. m.g_snippcnt = m.g_snippcnt + 1
  7237. \
  7238. \*       <<m.g_corn1>><<SAFEREPL(m.g_horiz,57)>><<m.g_corn2>>
  7239. \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7240. IF m.readlevel
  7241.    \*       <<m.g_verti1>>
  7242.    \\ <<UPPER(m.procname)>>           <<m.from>>
  7243.    \\<<SAFEREPL(" ",45-LEN(m.procname+m.from))>><<m.g_verti2>>
  7244. ELSE
  7245.    \*       <<m.g_verti1>>
  7246.    \\ <<UPPER(m.procname)>>           <<m.varname>> <<m.from>>
  7247.    \\<<SAFEREPL(" ",44-LEN(m.procname+m.varname+m.from))>><<m.g_verti2>>
  7248. ENDIF
  7249. \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7250. \*       <<m.g_verti1>> Function Origin:
  7251. \\<<SAFEREPL(" ",40)>><<m.g_verti2>>
  7252. IF m.readlevel
  7253.    \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7254.    \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7255.    \*       <<m.g_verti1>> From Platform:
  7256.    \\       <<VersionCap(m.g_genvers, .F.)>>
  7257.    \\<<SAFEREPL(" ",35-LEN(VersionCap(m.g_genvers, .F.)))>>
  7258.    \\<<m.g_verti2>>
  7259.    \*       <<m.g_verti1>> From Screen:
  7260.    IF m.g_nscreens > 1 AND NOT m.g_multread
  7261.       \\         Multiple Screens
  7262.       \\<<SAFEREPL(" ",19)>><<m.g_verti2>>
  7263.    ELSE
  7264.       \\         <<basename(SYS(2014,DBF()))>>
  7265.       \\<<SAFEREPL(" ",35-LEN(basename(SYS(2014,DBF()))))>>
  7266.       \\<<m.g_verti2>>
  7267.    ENDIF
  7268.    \*       <<m.g_verti1>> Called By:           READ Statement
  7269.    \\<<SAFEREPL(" ",21)>><<m.g_verti2>>
  7270.    \*       <<m.g_verti1>> Snippet Number:
  7271.    \\      <<ALLTRIM(STR(m.g_snippcnt,2))>>
  7272.    \\<<SAFEREPL(" ",35-LEN(ALLTRIM(STR(m.g_snippcnt,2))))>><<m.g_verti2>>
  7273.    \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7274.    \*       <<m.g_corn3>><<SAFEREPL(m.g_horiz,57)>><<m.g_corn4>>
  7275.    \*
  7276.    RETURN
  7277. ENDIF
  7278. \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7279. \*       <<m.g_verti1>> From Platform:
  7280. \\       <<VersionCap(m.g_genvers, .F.)>>
  7281. \\<<SAFEREPL(" ",35-LEN(VersionCap(m.g_genvers, .F.)))>>
  7282. \\<<m.g_verti2>>
  7283. \*       <<m.g_verti1>> From Screen:
  7284. \\         <<basename(SYS(2014,DBF()))>>
  7285. \\,     Record Number:  <<STR(RECNO(),3)>>
  7286. \\<<SAFEREPL(" ",10-LEN(basename(SYS(2014,DBF())+STR(RECNO(),3))))>>
  7287. \\<<m.g_verti2>>
  7288. IF NOT EMPTY(m.varname)
  7289.    \*       <<m.g_verti1>> Variable:            <<m.varname>>
  7290.    \\<<SAFEREPL(" ",35-LEN(m.varname))>><<m.g_verti2>>
  7291. ENDIF
  7292. \*       <<m.g_verti1>> Called By:           <<m.from+" Clause">>
  7293. \\<<SAFEREPL(" ",35-LEN(m.from+" Clause"))>><<m.g_verti2>>
  7294. IF OBJECT(objtype) <> ""
  7295.    \*       <<m.g_verti1>> Object Type:
  7296.    \\         <<Object(Objtype)>>
  7297.    \\<<SAFEREPL(" ",35-LEN(Object(Objtype)))>><<m.g_verti2>>
  7298. ENDIF
  7299. \*       <<m.g_verti1>> Snippet Number:
  7300. \\      <<ALLTRIM(STR(m.g_snippcnt,3))>>
  7301. \\<<SAFEREPL(" ",35-LEN(ALLTRIM(STR(m.g_snippcnt,3))))>><<m.g_verti2>>
  7302. \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7303. \*       <<m.g_corn3>><<SAFEREPL(m.g_horiz,57)>><<m.g_corn4>>
  7304. \*
  7305. RETURN
  7306.  
  7307. *!*****************************************************************************
  7308. *!
  7309. *!      Procedure: COMMENTBLOCK
  7310. *!
  7311. *!      Called by: GENCLEANUP         (procedure in GENSCRN.PRG)
  7312. *!               : PUTPROCHEAD        (procedure in GENSCRN.PRG)
  7313. *!               : GENSECT1           (procedure in GENSCRN.PRG)
  7314. *!               : GENSECT2           (procedure in GENSCRN.PRG)
  7315. *!               : GENCLOSEDBFS       (procedure in GENSCRN.PRG)
  7316. *!               : GENOPENDBFS        (procedure in GENSCRN.PRG)
  7317. *!               : BUILDFMT           (procedure in GENSCRN.PRG)
  7318. *!               : PLACEREAD          (procedure in GENSCRN.PRG)
  7319. *!               : DEFWINDOWS         (procedure in GENSCRN.PRG)
  7320. *!
  7321. *!          Calls: BASENAME()         (function  in GENSCRN.PRG)
  7322. *!               : VERSIONCAP()       (function  in GENSCRN.PRG)
  7323. *!
  7324. *!*****************************************************************************
  7325. PROCEDURE commentblock
  7326. *)
  7327. *) COMMENTBLOCK - Generate a comment block.
  7328. *)
  7329. PARAMETER m.dbalias, m.string
  7330. PRIVATE m.msg
  7331. IF !EMPTY(basename(m.dbalias))
  7332.    m.msg = basename(m.dbalias)+"/"+versioncap(m.g_genvers, .F.)+m.string
  7333. ELSE
  7334.    m.msg = versioncap(m.g_genvers, .F.)+m.string
  7335. ENDIF
  7336. \
  7337. \*       <<m.g_corn1>><<SAFEREPL(m.g_horiz,57)>><<m.g_corn2>>
  7338. \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7339. \*       <<m.g_verti1>>
  7340. \\ <<PADC(m.msg,55," ")>>
  7341. \\ <<m.g_verti2>>
  7342. \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7343. \*       <<m.g_corn3>><<SAFEREPL(m.g_horiz,57)>><<m.g_corn4>>
  7344. \*
  7345. \
  7346.  
  7347. *!*****************************************************************************
  7348. *!
  7349. *!      Procedure: PROCCOMMENTBLOCK
  7350. *!
  7351. *!      Called by: EXTRACTPROCS       (procedure in GENSCRN.PRG)
  7352. *!
  7353. *!          Calls: BASENAME()         (function  in GENSCRN.PRG)
  7354. *!
  7355. *!*****************************************************************************
  7356. PROCEDURE proccommentblock
  7357. *)
  7358. *) PROCCOMMENTBLOCK - Generate a procedure comment block.
  7359. *)
  7360. PARAMETER m.dbalias, m.string
  7361. PRIVATE m.msg
  7362. m.msg = basename(m.dbalias)+m.string
  7363. \
  7364. \*       <<m.g_corn1>><<SAFEREPL(m.g_horiz,57)>><<m.g_corn2>>
  7365. \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7366. \*       <<m.g_verti1>>
  7367. \\ <<PADC(m.msg,55," ")>>
  7368. \\ <<m.g_verti2>>
  7369. \*       <<m.g_verti1>><<SAFEREPL(" ",57)>><<m.g_verti2>>
  7370. \*       <<m.g_corn3>><<SAFEREPL(m.g_horiz,57)>><<m.g_corn4>>
  7371. \*
  7372. \
  7373. RETURN
  7374.  
  7375. *!*****************************************************************************
  7376. *!
  7377. *!      Procedure: GENCOMMENT
  7378. *!
  7379. *!      Called by: GENVALIDBODY       (procedure in GENSCRN.PRG)
  7380. *!               : GENWHENBODY        (procedure in GENSCRN.PRG)
  7381. *!               : ACTICLAUSE         (procedure in GENSCRN.PRG)
  7382. *!               : DEATCLAUSE         (procedure in GENSCRN.PRG)
  7383. *!               : SHOWCLAUSE         (procedure in GENSCRN.PRG)
  7384. *!               : PLACESAYS          (procedure in GENSCRN.PRG)
  7385. *!
  7386. *!*****************************************************************************
  7387. PROCEDURE gencomment
  7388. *)
  7389. *) GENCOMMENT - Generate a comment.
  7390. *)
  7391. PARAMETER m.msg
  7392. \*
  7393. \* <<m.msg>>
  7394. \*
  7395.  
  7396. *!*****************************************************************************
  7397. *!
  7398. *!      Procedure: SAFEREPL
  7399. *!
  7400. *!*****************************************************************************
  7401. FUNCTION saferepl
  7402. * REPLICATE shell
  7403. PARAMETER m.strg, m.num
  7404. RETURN REPLICATE(m.strg, max(m.num, 0))
  7405.  
  7406. **
  7407. ** General Supporting Routines
  7408. **
  7409.  
  7410. *!*****************************************************************************
  7411. *!
  7412. *!       Function: BASENAME
  7413. *!
  7414. *!      Called by: PREPSCREENS()      (function  in GENSCRN.PRG)
  7415. *!               : GENVALIDBODY       (procedure in GENSCRN.PRG)
  7416. *!               : GENWHENBODY        (procedure in GENSCRN.PRG)
  7417. *!               : ACTICLAUSE         (procedure in GENSCRN.PRG)
  7418. *!               : DEATCLAUSE         (procedure in GENSCRN.PRG)
  7419. *!               : SHOWCLAUSE         (procedure in GENSCRN.PRG)
  7420. *!               : GENRELSTMTS        (procedure in GENSCRN.PRG)
  7421. *!               : COMMENTBLOCK       (procedure in GENSCRN.PRG)
  7422. *!               : PROCCOMMENTBLOCK   (procedure in GENSCRN.PRG)
  7423. *!
  7424. *!          Calls: STRIPPATH()        (function  in GENSCRN.PRG)
  7425. *!               : STRIPEXT()         (function  in GENSCRN.PRG)
  7426. *!
  7427. *!*****************************************************************************
  7428. FUNCTION basename
  7429. PARAMETER m.filename
  7430. RETURN strippath(stripext(m.filename))
  7431.  
  7432. *!*****************************************************************************
  7433. *!
  7434. *!       Function: STRIPEXT
  7435. *!
  7436. *!      Called by: OPENPROJDBF()      (function  in GENSCRN.PRG)
  7437. *!               : BASENAME()         (function  in GENSCRN.PRG)
  7438. *!
  7439. *!*****************************************************************************
  7440. FUNCTION stripext
  7441. *)
  7442. *) STRIPEXT - Strip the extension from a file name.
  7443. *)
  7444. *) Description:
  7445. *) Use the algorithm employed by FoxPRO itself to strip a
  7446. *) file of an extension (if any): Find the rightmost dot in
  7447. *) the filename.  If this dot occurs to the right of a "\"
  7448. *) or ":", then treat everything from the dot rightward
  7449. *) as an extension.  Of course, if we found no dot,
  7450. *) we just hand back the filename unchanged.
  7451. *)
  7452. *) Parameters:
  7453. *) filename - character string representing a file name
  7454. *)
  7455. *) Return value:
  7456. *) The string "filename" with any extension removed
  7457. *)
  7458. PARAMETER m.filename
  7459. PRIVATE m.dotpos, m.terminator
  7460. m.dotpos = RAT(".", m.filename)
  7461. m.terminator = MAX(RAT("\", m.filename), RAT(":", m.filename))
  7462. IF m.dotpos > m.terminator
  7463.    m.filename = LEFT(m.filename, m.dotpos-1)
  7464. ENDIF
  7465. RETURN m.filename
  7466.  
  7467. *!*****************************************************************************
  7468. *!
  7469. *!       Function: STRIPPATH
  7470. *!
  7471. *!      Called by: GENOPENDBFS        (procedure in GENSCRN.PRG)
  7472. *!               : BASENAME()         (function  in GENSCRN.PRG)
  7473. *!
  7474. *!*****************************************************************************
  7475. FUNCTION strippath
  7476. *)
  7477. *) STRIPPATH - Strip the path from a file name.
  7478. *)
  7479. *) Description:
  7480. *) Find positions of backslash in the name of the file.  If there is one
  7481. *) take everything to the right of its position and make it the new file
  7482. *) name.  If there is no slash look for colon.  Again if found, take
  7483. *) everything to the right of it as the new name.  If neither slash
  7484. *) nor colon are found then return the name unchanged.
  7485. *)
  7486. *) Parameters:
  7487. *) filename - character string representing a file name
  7488. *)
  7489. *) Return value:
  7490. *) The string "filename" with any path removed
  7491. *)
  7492. PARAMETER m.filename
  7493. PRIVATE m.slashpos, m.namelen, m.colonpos
  7494. m.slashpos = RAT("\", m.filename)
  7495. IF m.slashpos > 0
  7496.    m.namelen  = LEN(m.filename) - m.slashpos
  7497.    m.filename = RIGHT(m.filename, m.namelen)
  7498. ELSE
  7499.    m.colonpos = RAT(":", m.filename)
  7500.    IF m.colonpos > 0
  7501.       m.namelen  = LEN(m.filename) - m.colonpos
  7502.       m.filename = RIGHT(m.filename, m.namelen)
  7503.    ENDIF
  7504. ENDIF
  7505. RETURN m.filename
  7506.  
  7507. *!*****************************************************************************
  7508. *!
  7509. *!       Function: STRIPCR
  7510. *!
  7511. *!*****************************************************************************
  7512. FUNCTION stripcr
  7513. *)
  7514. *) STRIPCR - Strip off terminating carriage returns and line feeds
  7515. *)
  7516. PARAMETER m.strg
  7517. * Don't use a CHRTRAN since it's remotely possible that the CR or LF might
  7518. * be in a user's quoted string.
  7519. strg = ALLTRIM(strg)
  7520. i = LEN(strg)
  7521. DO WHILE i >= 0 AND INLIST(SUBSTR(strg,i,1),CHR(13),CHR(10))
  7522.    i = i - 1
  7523. ENDDO
  7524. RETURN LEFT(strg,i)
  7525.  
  7526. *!*****************************************************************************
  7527. *!
  7528. *!       Function: ADDBS
  7529. *!
  7530. *!      Called by: FORCEEXT()         (function  in GENSCRN.PRG)
  7531. *!
  7532. *!*****************************************************************************
  7533. FUNCTION addbs
  7534. *)
  7535. *) ADDBS - Add a backslash unless there is one already there.
  7536. *)
  7537. PARAMETER m.pathname
  7538. PRIVATE m.separator
  7539. m.separator = IIF(_MAC,":","\")
  7540. m.pathname = ALLTRIM(UPPER(m.pathname))
  7541. IF !(RIGHT(m.pathname,1) $ '\:') AND !EMPTY(m.pathname)
  7542.    m.pathname = m.pathname + m.separator
  7543. ENDIF
  7544. RETURN m.pathname
  7545.  
  7546. *!*****************************************************************************
  7547. *!
  7548. *!       Function: JUSTFNAME
  7549. *!
  7550. *!      Called by: FORCEEXT()         (function  in GENSCRN.PRG)
  7551. *!
  7552. *!*****************************************************************************
  7553. FUNCTION justfname
  7554. *)
  7555. *) JUSTFNAME - Return just the filename (i.e., no path) from "filname"
  7556. *)
  7557. PARAMETERS m.filname
  7558. IF RAT('\',m.filname) > 0
  7559.    m.filname = SUBSTR(m.filname,RAT('\',m.filname)+1,255)
  7560. ENDIF
  7561. IF AT(':',m.filname) > 0
  7562.    m.filname = SUBSTR(m.filname,AT(':',m.filname)+1,255)
  7563. ENDIF
  7564. RETURN ALLTRIM(UPPER(m.filname))
  7565.  
  7566. *!*****************************************************************************
  7567. *!
  7568. *!       Function: JUSTSTEM
  7569. *!
  7570. *!*****************************************************************************
  7571. FUNCTION juststem
  7572. * Return just the stem name from "filname"
  7573. PARAMETERS m.filname
  7574. IF RAT('\',m.filname) > 0
  7575.    m.filname = SUBSTR(m.filname,RAT('\',m.filname)+1,255)
  7576. ENDIF
  7577. IF RAT(':',m.filname) > 0
  7578.    m.filname = SUBSTR(m.filname,RAT(':',m.filname)+1,255)
  7579. ENDIF
  7580. IF AT('.',m.filname) > 0
  7581.    m.filname = SUBSTR(m.filname,1,AT('.',m.filname)-1)
  7582. ENDIF
  7583. RETURN ALLTRIM(UPPER(m.filname))
  7584.  
  7585. *!*****************************************************************************
  7586. *!
  7587. *!       Function: JUSTPATH
  7588. *!
  7589. *!      Called by: FORCEEXT()         (function  in GENSCRN.PRG)
  7590. *!
  7591. *!*****************************************************************************
  7592. FUNCTION justpath
  7593. *)
  7594. *) JUSTPATH - Returns just the pathname.
  7595. *)
  7596. PARAMETERS m.filname
  7597. m.filname = ALLTRIM(UPPER(m.filname))
  7598. IF '\' $ m.filname
  7599.    m.filname = SUBSTR(m.filname,1,RAT('\',m.filname))
  7600.    IF RIGHT(m.filname,1) = '\' AND LEN(m.filname) > 1 ;
  7601.             AND SUBSTR(m.filname,LEN(m.filname)-1,1) <> ':'
  7602.          filname = SUBSTR(m.filname,1,LEN(m.filname)-1)
  7603.    ENDIF
  7604.    RETURN m.filname
  7605. ELSE
  7606.    RETURN ''
  7607. ENDIF
  7608.  
  7609.  
  7610. *!*****************************************************************************
  7611. *!
  7612. *!       Function: JUSTEXT
  7613. *!
  7614. *!*****************************************************************************
  7615. FUNCTION justext
  7616. * Return just the extension from "filname"
  7617. PARAMETERS m.filname
  7618. PRIVATE m.ext
  7619. filname = justfname(m.filname)   && prevents problems with ..\ paths
  7620. m.ext = ""
  7621. IF AT('.',m.filname) > 0
  7622.    m.ext = SUBSTR(m.filname,AT('.',m.filname)+1,3)
  7623. ENDIF
  7624. RETURN UPPER(m.ext)
  7625.  
  7626. *!*****************************************************************************
  7627. *!
  7628. *!       Function: FORCEEXT
  7629. *!
  7630. *!          Calls: JUSTPATH()         (function  in GENSCRN.PRG)
  7631. *!               : JUSTFNAME()        (function  in GENSCRN.PRG)
  7632. *!               : ADDBS()            (function  in GENSCRN.PRG)
  7633. *!
  7634. *!*****************************************************************************
  7635. FUNCTION forceext
  7636. *)
  7637. *) FORCEEXT - Force filename to have a particular extension.
  7638. *)
  7639. PARAMETERS m.filname,m.ext
  7640. PRIVATE m.ext
  7641. IF SUBSTR(m.ext,1,1) = "."
  7642.    m.ext = SUBSTR(m.ext,2,3)
  7643. ENDIF
  7644.  
  7645. m.pname = justpath(m.filname)
  7646. m.filname = justfname(UPPER(ALLTRIM(m.filname)))
  7647. IF AT('.',m.filname) > 0
  7648.    m.filname = SUBSTR(m.filname,1,AT('.',m.filname)-1) + '.' + m.ext
  7649. ELSE
  7650.    m.filname = m.filname + '.' + m.ext
  7651. ENDIF
  7652. RETURN addbs(m.pname) + m.filname
  7653.  
  7654. *!*****************************************************************************
  7655. *!
  7656. *!       Function: UNIQUEWIN
  7657. *!
  7658. *!      Called by: GENWINDEFI         (procedure in GENSCRN.PRG)
  7659. *!
  7660. *!*****************************************************************************
  7661. FUNCTION uniquewin
  7662. *)
  7663. *) UNIQUEWIN - Check if a window name is unique.
  7664. *)
  7665. PARAMETER m.windowname, m.windcnt, m.arry
  7666. EXTERNAL ARRAY arry
  7667. PRIVATE m.found, m.i, m.first, m.middle
  7668. m.found  = .F.
  7669. m.first  = 1
  7670. m.last   = m.windcnt
  7671. m.middle = 0
  7672.  
  7673. IF EMPTY(arry[1,1])
  7674.    RETURN 1
  7675. ENDIF
  7676. DO WHILE (m.last >= m.first) AND NOT m.found
  7677.    m.middle = INT((m.first+m.last) / 2)
  7678.    DO CASE
  7679.    CASE m.windowname < arry[m.middle,1]
  7680.       m.last = m.middle - 1
  7681.    CASE m.windowname > arry[m.middle,1]
  7682.       m.first = m.middle + 1
  7683.    OTHERWISE
  7684.       m.found = .T.
  7685.    ENDCASE
  7686. ENDDO
  7687. IF m.found
  7688.    RETURN 0
  7689. ELSE
  7690.    RETURN m.first
  7691. ENDIF
  7692. RETURN
  7693.  
  7694. *!*****************************************************************************
  7695. *!
  7696. *!      Procedure: ADDTOCTRL
  7697. *!
  7698. *!      Called by: ELEMRANGE          (procedure in GENSCRN.PRG)
  7699. *!               : ANYVALID           (procedure in GENSCRN.PRG)
  7700. *!               : ANYWHEN            (procedure in GENSCRN.PRG)
  7701. *!               : ANYMESSAGE         (procedure in GENSCRN.PRG)
  7702. *!               : ANYERROR           (procedure in GENSCRN.PRG)
  7703. *!
  7704. *!          Calls: GETPLATNUM()       (function  in GENSCRN.PRG)
  7705. *!               : GENFUNCHEADER      (procedure in GENSCRN.PRG)
  7706. *!               : OKTOGENERATE()     (function  in GENSCRN.PRG)
  7707. *!               : ATWNAME()          (function  in GENSCRN.PRG)
  7708. *!               : ISCOMMENT()        (function  in GENSCRN.PRG)
  7709. *!               : GENINSERTCODE      (procedure in GENSCRN.PRG)
  7710. *!
  7711. *!*****************************************************************************
  7712. PROCEDURE addtoctrl
  7713. *)
  7714. *) ADDTOCTRL - Generate clause code for object level cluses.
  7715. *)
  7716. PARAMETER m.procname, m.from, m.memo, m.varname
  7717. PRIVATE m.linecnt, m.count, m.textline, m.genfunction, m.notcomnt, m.at, ;
  7718.    m.thispretext, m.in_dec, m.platnum, m.wnamelen, m.upline, m.thisplat
  7719.  
  7720. m.thisplat = IIF(TYPE("platform") <> "U",platform,"DOS")
  7721. m.platnum = getplatnum(m.thisplat)
  7722.  
  7723. * Write this clause to the temporary file
  7724. _TEXT = m.g_tmphandle
  7725. m.thispretext = _PRETEXT
  7726. _PRETEXT = ""
  7727.  
  7728. m.genfunction = .F.
  7729. m.notcomnt = 0
  7730. m.linecnt = MEMLINES(m.memo)
  7731. _MLINE = 0
  7732. DO genfuncheader WITH m.procname, m.from, .F., ALLTRIM(m.varname)
  7733. FOR m.count = 1 TO m.linecnt
  7734.    m.textline = MLINE(m.memo, 1, _MLINE)
  7735.    DO killcr WITH m.textline
  7736.    m.upline = UPPER(LTRIM(CHRTRAN(m.textline,chr(9),' ')))
  7737.    IF oktogenerate(@upline, @notcomnt)
  7738.       IF m.notcomnt > 0 AND NOT m.genfunction
  7739.          \FUNCTION <<m.procname>>     &&  <<m.varname>> <<m.from>>
  7740.          in_dec = SET("DECIMALS")
  7741.          SET DECIMALS TO 0
  7742.          \#REGION <<INT(m.g_screen)>>
  7743.          SET DECIMALS TO in_dec
  7744.          m.genfunction = .T.
  7745.       ENDIF
  7746.  
  7747.       IF NOT EMPTY(g_wnames[m.g_screen, m.platnum])
  7748.          m.at = atwname(g_wnames[m.g_screen, m.platnum], m.textline)
  7749.          IF m.at <> 0 AND !iscomment(@textline)
  7750.             m.wnamelen = LEN(g_wnames[m.g_screen, m.platnum])
  7751.             \<<STUFF(m.textline, m.at, m.wnamelen,g_screens[m.g_screen,2])>>
  7752.          ELSE
  7753.             IF !geninsertcode(@upline,m.g_screen, .F., m.thisplat)
  7754.                \<<m.textline>>
  7755.             ENDIF
  7756.          ENDIF
  7757.       ELSE
  7758.          IF !geninsertcode(@upline,m.g_screen, .F., m.thisplat)
  7759.             \<<m.textline>>
  7760.          ENDIF
  7761.       ENDIF
  7762.    ENDIF
  7763. ENDFOR
  7764. IF m.notcomnt = 0
  7765.    \FUNCTION <<m.procname>>     &&  <<m.varname>> <<m.from>>
  7766. ENDIF
  7767. _TEXT = m.g_orghandle
  7768. _PRETEXT = m.thispretext
  7769. RETURN
  7770.  
  7771. *!*****************************************************************************
  7772. *!
  7773. *!       Function: OKTOGENERATE
  7774. *!
  7775. *!      Called by: ADDTOCTRL          (procedure in GENSCRN.PRG)
  7776. *!
  7777. *!          Calls: WORDNUM()          (function  in GENSCRN.PRG)
  7778. *!               : MATCH()            (function  in GENSCRN.PRG)
  7779. *!
  7780. *!*****************************************************************************
  7781. FUNCTION oktogenerate
  7782. *)
  7783. *) OKTOGENERATE - Ok to generate this line?
  7784. *)
  7785. *) Description:
  7786. *) Check if the code segment provided by the user for the object level
  7787. *) VALID, MESSAGE, and WHEN clauses does not contain 'FUNCTION',
  7788. *) 'PROCEDURE' or 'PARAMETER' statements as its first non-comment
  7789. *) statements.  Further, do not output #NAME directives. This is done on line by
  7790. *) line basis.
  7791. *)
  7792. *) "notcomnt" needs to be passed by reference, and is changed in this module
  7793. *) m.statement must already be in upper case and trimmed.  It may be passed by reference.
  7794. PARAMETER m.statement, m.notcomnt
  7795.  
  7796. PRIVATE m.asterisk, m.ampersand, m.isnote, m.name, m.word1
  7797. IF EMPTY(m.statement)
  7798.    RETURN .T.
  7799. ENDIF
  7800.  
  7801. DO CASE
  7802. CASE AT("*", m.statement) = 1 ;
  7803.       OR AT(m.g_dblampersand, m.statement) = 1 ;
  7804.       OR AT("NOTE", m.statement) = 1
  7805.    RETURN .T.
  7806. OTHERWISE
  7807.    * OK, it's not a comment
  7808.    m.notcomnt = m.notcomnt + 1
  7809.    * Make a quick test to see if we may exclude this line
  7810.    IF AT(LEFT(statement,1),"PF#") > 0
  7811.       * Postpone the expensive wordnum and match functions as long as possible
  7812.       word1 = CHRTRAN(wordnum(statement,1),';','')
  7813.       DO CASE
  7814.       CASE match(word1,"PROCEDURE") OR match(word1,"FUNCTION") OR match(word1,"PARAMETERS")
  7815.          *
  7816.          * If the first non-comment line is a FUNCTION, PROCEDURE, or
  7817.          * a PARAMETER statement then do not generate it.
  7818.          *
  7819.          IF m.notcomnt = 1
  7820.             RETURN .F.
  7821.          ENDIF
  7822.       CASE LEFT(statement,5) == "#NAME"   && Don't ever emit a #NAME directive
  7823.          RETURN .F.
  7824.       ENDCASE
  7825.    ENDIF
  7826. ENDCASE
  7827. RETURN .T.
  7828.  
  7829. *!*****************************************************************************
  7830. *!
  7831. *!       Function: OBJECT
  7832. *!
  7833. *!*****************************************************************************
  7834. FUNCTION OBJECT
  7835. *)
  7836. *) OBJECT - Return name of an object.
  7837. *)
  7838. PARAMETER m.objecttype
  7839. PRIVATE m.objname
  7840. DO CASE
  7841. CASE m.objecttype = 11
  7842.    m.objname = "List"
  7843. CASE m.objecttype = 12
  7844.    m.objname = "Push Button"
  7845. CASE m.objecttype = 13
  7846.    m.objname = "Radio Button"
  7847. CASE m.objecttype = 14
  7848.    m.objname = "Check Box"
  7849. CASE m.objecttype = 15
  7850.    m.objname = "Field"
  7851. CASE m.objecttype = 16
  7852.    m.objname = "Popup"
  7853. OTHERWISE
  7854.    m.objname = ""
  7855. ENDCASE
  7856. RETURN m.objname
  7857.  
  7858. *!*****************************************************************************
  7859. *!
  7860. *!      Procedure: COMBINE
  7861. *!
  7862. *!      Called by: BUILD              (procedure in GENSCRN.PRG)
  7863. *!
  7864. *!          Calls: ERRORHANDLER       (procedure in GENSCRN.PRG)
  7865. *!
  7866. *!*****************************************************************************
  7867. PROCEDURE combine
  7868. *)
  7869. *) COMBINE - Combine the original and the temp files.
  7870. *)
  7871. PRIVATE m.size, m.top, m.end, m.status, m.chunk
  7872.  
  7873. IF m.g_graphic
  7874.    SET MESSAGE TO 'Merging Files'
  7875. ENDIF
  7876. m.size = FSEEK(m.g_tmphandle,0,2)
  7877. m.top  = FSEEK(m.g_tmphandle,0)
  7878.  
  7879. DO WHILE .T.
  7880.    m.chunk = IIF(m.size>65000, 65000, m.size)
  7881.    m.end   = FSEEK(m.g_orghandle,0,2)
  7882.    m.status = FWRITE(m.g_orghandle,FREAD(m.g_tmphandle,m.chunk))
  7883.    IF m.status = 0 AND m.size > 0
  7884.       DO errorhandler WITH "Unsuccessful file merge...",;
  7885.          LINENO(), c_error_2
  7886.    ENDIF
  7887.    m.size = m.size - 65000
  7888.    IF m.size < 0
  7889.       EXIT
  7890.    ENDIF
  7891. ENDDO
  7892. IF m.g_graphic
  7893.    SET MESSAGE TO 'Generation Complete'
  7894. ELSE
  7895.    WAIT CLEAR
  7896. ENDIF
  7897. RETURN
  7898.  
  7899. **
  7900. ** Code Associated With Displaying of the Thermometer
  7901. **
  7902.  
  7903. *!*****************************************************************************
  7904. *!
  7905. *!      Procedure: ACTTHERM
  7906. *!
  7907. *!      Called by: BUILD              (procedure in GENSCRN.PRG)
  7908. *!
  7909. *!*****************************************************************************
  7910. PROCEDURE acttherm
  7911. *)
  7912. *) ACTTHERM(<text>) - Activate thermometer.
  7913. *)
  7914. *) Activates thermometer.  Update the thermometer with UPDTHERM().
  7915. *) Thermometer window is named "thermometer."  Be sure to RELEASE
  7916. *) this window when done with thermometer.  Creates the global
  7917. *) m.g_thermwidth.
  7918. *)
  7919. PARAMETER m.text
  7920. PRIVATE m.prompt
  7921.  
  7922. IF m.g_graphic
  7923.    m.prompt = LOWER(m.g_outfile)
  7924.     m.prompt = thermfname(m.prompt)
  7925.  
  7926.    DO CASE
  7927.    CASE _WINDOWS
  7928.       DEFINE WINDOW thermomete ;
  7929.          AT  INT((SROW() - (( 5.615 * ;
  7930.          FONTMETRIC(1, m.g_dlgface, m.g_dlgsize, m.g_dlgstyle )) / ;
  7931.          FONTMETRIC(1, WFONT(1,""), WFONT( 2,""), WFONT(3,"")))) / 2), ;
  7932.          INT((SCOL() - (( 63.833 * ;
  7933.          FONTMETRIC(6, m.g_dlgface, m.g_dlgsize, m.g_dlgstyle )) / ;
  7934.          FONTMETRIC(6, WFONT(1,""), WFONT( 2,""), WFONT(3,"")))) / 2) ;
  7935.          SIZE 5.615,63.833 ;
  7936.          FONT m.g_dlgface, m.g_dlgsize ;
  7937.          STYLE m.g_dlgstyle ;
  7938.          NOFLOAT ;
  7939.          NOCLOSE ;
  7940.          NONE ;
  7941.          COLOR RGB(0, 0, 0, 192, 192, 192)
  7942.       MOVE WINDOW thermomete CENTER
  7943.       ACTIVATE WINDOW thermomete NOSHOW
  7944.  
  7945.       @ 0.5,3 SAY m.text FONT m.g_dlgface, m.g_dlgsize STYLE m.g_dlgstyle
  7946.       @ 1.5,3 SAY m.prompt FONT m.g_dlgface, m.g_dlgsize STYLE m.g_dlgstyle
  7947.       @ 0.000,0.000 TO 0.000,63.833 ;
  7948.          COLOR RGB(255, 255, 255, 255, 255, 255)
  7949.       @ 0.000,0.000 TO 5.615,0.000 ;
  7950.          COLOR RGB(255, 255, 255, 255, 255, 255)
  7951.       @ 0.385,0.667 TO 5.231,0.667 ;
  7952.          COLOR RGB(128, 128, 128, 128, 128, 128)
  7953.       @ 0.308,0.667 TO 0.308,63.167 ;
  7954.          COLOR RGB(128, 128, 128, 128, 128, 128)
  7955.       @ 0.385,63.000 TO 5.308,63.000 ;
  7956.          COLOR RGB(255, 255, 255, 255, 255, 255)
  7957.       @ 5.231,0.667 TO 5.231,63.167 ;
  7958.          COLOR RGB(255, 255, 255, 255, 255, 255)
  7959.       @ 5.538,0.000 TO 5.538,63.833 ;
  7960.          COLOR RGB(128, 128, 128, 128, 128, 128)
  7961.       @ 0.000,63.667 TO 5.615,63.667 ;
  7962.          COLOR RGB(128, 128, 128, 128, 128, 128)
  7963.       @ 3.000,3.333 TO 4.231,3.333 ;
  7964.          COLOR RGB(128, 128, 128, 128, 128, 128)
  7965.       @ 3.000,60.333 TO 4.308,60.333 ;
  7966.          COLOR RGB(255, 255, 255, 255, 255, 255)
  7967.       @ 3.000,3.333 TO 3.000,60.333 ;
  7968.          COLOR RGB(128, 128, 128, 128, 128, 128)
  7969.       @ 4.231,3.333 TO 4.231,60.333 ;
  7970.          COLOR RGB(255, 255, 255, 255, 255, 255)
  7971.       m.g_thermwidth = 56.269
  7972.    CASE _MAC
  7973.       DEFINE WINDOW thermomete ;
  7974.          AT  INT((SROW() - (( 5.62 * ;
  7975.          FONTMETRIC(1, m.g_dlgface, m.g_dlgsize, m.g_dlgstyle )) / ;
  7976.          FONTMETRIC(1, WFONT(1,""), WFONT( 2,""), WFONT(3,"")))) / 2), ;
  7977.          INT((SCOL() - (( 63.83 * ;
  7978.          FONTMETRIC(6, m.g_dlgface, m.g_dlgsize, m.g_dlgstyle )) / ;
  7979.          FONTMETRIC(6, WFONT(1,""), WFONT( 2,""), WFONT(3,"")))) / 2) ;
  7980.          SIZE 5.62,63.83 ;
  7981.          FONT m.g_dlgface, m.g_dlgsize ;
  7982.          STYLE m.g_dlgstyle ;
  7983.          NOFLOAT ;
  7984.          NOCLOSE ;
  7985.             NONE ;
  7986.          COLOR RGB(0, 0, 0, 192, 192, 192)
  7987.       MOVE WINDOW thermomete CENTER
  7988.       ACTIVATE WINDOW thermomete NOSHOW
  7989.  
  7990.       IF ISCOLOR()
  7991.          @ 0.000,0.000 TO 5.62,63.83 PATTERN 1;
  7992.              COLOR RGB(192, 192, 192, 192, 192, 192)
  7993.           @ 0.000,0.000 TO 0.000,63.83 ;
  7994.              COLOR RGB(255, 255, 255, 255, 255, 255)
  7995.           @ 0.000,0.000 TO 5.62,0.000 ;
  7996.              COLOR RGB(255, 255, 255, 255, 255, 255)
  7997.           @ 0.385,0.67 TO 5.23,0.67 ;
  7998.              COLOR RGB(128, 128, 128, 128, 128, 128)
  7999.           @ 0.31,0.67 TO 0.31,63.17 ;
  8000.              COLOR RGB(128, 128, 128, 128, 128, 128)
  8001.           @ 0.385,63.000 TO 5.31,63.000 ;
  8002.              COLOR RGB(255, 255, 255, 255, 255, 255)
  8003.           @ 5.23,0.67 TO 5.23,63.17 ;
  8004.              COLOR RGB(255, 255, 255, 255, 255, 255)
  8005.           @ 5.54,0.000 TO 5.54,63.83 ;
  8006.              COLOR RGB(128, 128, 128, 128, 128, 128)
  8007.           @ 0.000,63.67 TO 5.62,63.67 ;
  8008.              COLOR RGB(128, 128, 128, 128, 128, 128)
  8009.           @ 3.000,3.33 TO 4.23,3.33 ;
  8010.              COLOR RGB(128, 128, 128, 128, 128, 128)
  8011.           @ 3.000,60.33 TO 4.31,60.33 ;
  8012.              COLOR RGB(255, 255, 255, 255, 255, 255)
  8013.           @ 3.000,3.33 TO 3.000,60.33 ;
  8014.              COLOR RGB(128, 128, 128, 128, 128, 128)
  8015.           @ 4.23,3.33 TO 4.23,60.33 ;
  8016.              COLOR RGB(255, 255, 255, 255, 255, 255)
  8017.       ELSE
  8018.          @ 0.000, 0.000 TO 5.62, 63.830  PEN 2
  8019.           @ 0.230, 0.500 TO 5.39, 63.333  PEN 1
  8020.        ENDIF
  8021.       @ 0.5,3 SAY m.text FONT m.g_dlgface, m.g_dlgsize STYLE m.g_dlgstyle+"T" ;
  8022.          COLOR RGB(0,0,0,192,192,192)
  8023.       @ 1.5,3 SAY m.prompt FONT m.g_dlgface, m.g_dlgsize STYLE m.g_dlgstyle+"T" ;
  8024.          COLOR RGB(0,0,0,192,192,192)
  8025.  
  8026.       m.g_thermwidth = 56.27
  8027.         IF !ISCOLOR()
  8028.             @ 3.000,3.33 TO 4.23,m.g_thermwidth + 3.33
  8029.         ENDIF
  8030.    ENDCASE
  8031.    SHOW WINDOW thermomete TOP
  8032. ELSE
  8033.    m.prompt = SUBSTR(SYS(2014,m.g_outfile),1,48)+;
  8034.       IIF(LEN(m.g_outfile)>48,"...","")
  8035.  
  8036.    DEFINE WINDOW thermomete;
  8037.       FROM INT((SROW()-6)/2), INT((SCOL()-57)/2) ;
  8038.       TO INT((SROW()-6)/2) + 6, INT((SCOL()-57)/2) + 57;
  8039.       DOUBLE COLOR SCHEME 5
  8040.    ACTIVATE WINDOW thermomete NOSHOW
  8041.  
  8042.    m.g_thermwidth = 50
  8043.    @ 0,3 SAY m.text
  8044.    @ 1,3 SAY UPPER(m.prompt)
  8045.    @ 2,1 TO 4,m.g_thermwidth+4 &g_boxstrg
  8046.  
  8047.    SHOW WINDOW thermomete TOP
  8048. ENDIF
  8049. RETURN
  8050.  
  8051. *!*****************************************************************************
  8052. *!
  8053. *!      Procedure: UPDTHERM
  8054. *!
  8055. *!      Called by: BUILD              (procedure in GENSCRN.PRG)
  8056. *!               : DISPATCHBUILD      (procedure in GENSCRN.PRG)
  8057. *!               : BUILDCTRL          (procedure in GENSCRN.PRG)
  8058. *!               : EXTRACTPROCS       (procedure in GENSCRN.PRG)
  8059. *!               : BUILDFMT           (procedure in GENSCRN.PRG)
  8060. *!
  8061. *!*****************************************************************************
  8062. PROCEDURE updtherm
  8063. *)
  8064. *) UPDTHERM(<percent>) - Update thermometer.
  8065. *)
  8066. PARAMETER m.percent
  8067. PRIVATE m.nblocks, m.percent
  8068.  
  8069. ACTIVATE WINDOW thermomete
  8070.  
  8071. * Map to the number of platforms we are generating for
  8072. m.percent = MIN(INT(m.percent / m.g_numplatforms) ,100)
  8073.  
  8074. m.nblocks = (m.percent/100) * (m.g_thermwidth)
  8075. DO CASE
  8076. CASE _WINDOWS
  8077.    @ 3.000,3.333 TO 4.231,m.nblocks + 3.333 ;
  8078.       PATTERN 1 COLOR RGB(128, 128, 128, 128, 128, 128)
  8079. CASE _MAC
  8080.    *@ 3.000,3.33 TO 4.23,m.nblocks + 3.33 ;
  8081.    *   PATTERN 1 COLOR RGB(0, 0, 0, 220, 140, 120)
  8082.    @ 3.000,3.33 TO 4.23,m.nblocks + 3.33 ;
  8083.       PATTERN 1 COLOR RGB(0, 0, 128, 0, 0, 128)
  8084. OTHERWISE
  8085.    @ 3,3 SAY REPLICATE("█",m.nblocks)
  8086. ENDCASE
  8087. RETURN
  8088.  
  8089. *!*****************************************************************************
  8090. *!
  8091. *!      Procedure: DEACTTHERMO
  8092. *!
  8093. *!      Called by: BUILD              (procedure in GENSCRN.PRG)
  8094. *!
  8095. *!*****************************************************************************
  8096. PROCEDURE deactthermo
  8097. *)
  8098. *) DEACTTHERMO - Deactivate and Release thermometer window.
  8099. *)
  8100. IF WEXIST("thermomete")
  8101.    RELEASE WINDOW thermomete
  8102. ENDIF
  8103. RETURN
  8104.  
  8105. *!*****************************************************************************
  8106. *!
  8107. *!      Procedure: THERMADJ
  8108. *!
  8109. *!*****************************************************************************
  8110. FUNCTION thermadj
  8111. * Map the local thermometer from local (this platform) to global (all platforms)
  8112. * When all platforms have been accounted for, we want to show m.finish percent.
  8113. PARAMETERS m.pnum, m.current, m.finish
  8114. =assert(m.current <= m.finish,"Thermometer error!  Current > finish.")
  8115. =assert(BETWEEN(m.finish,0,100),"Thermometer error! Finish out of range.")
  8116. RETURN (m.finish * (m.pnum - 1)) + m.current
  8117.  
  8118.  
  8119. *!*****************************************************************************
  8120. *!
  8121. *!      Procedure: THERMFNAME
  8122. *!
  8123. *!*****************************************************************************
  8124. FUNCTION thermfname
  8125. PARAMETER m.fname
  8126. PRIVATE m.addelipse, m.g_pathsep, m.g_thermfface, m.g_thermfsize, m.g_thermfstyle
  8127.  
  8128. #define c_space 50
  8129. IF _MAC
  8130.     m.g_thermfface = "Geneva"
  8131.     m.g_thermfsize = 10
  8132.     m.g_thermfstyle = "B"
  8133. ELSE
  8134.     m.g_thermfface = "MS Sans Serif"
  8135.     m.g_thermfsize = 8
  8136.     m.g_thermfstyle = "B"
  8137. ENDIF
  8138.  
  8139. * Translate the filename into Mac native format
  8140. IF _MAC
  8141.     m.g_pathsep = ":"
  8142.     m.fname = SYS(2027, m.fname)
  8143. ELSE
  8144.     m.g_pathsep = "\"
  8145. ENDIF
  8146.  
  8147. IF TXTWIDTH(m.fname,m.g_thermfface,m.g_thermfsize,m.g_thermfstyle) > c_space
  8148.     * Make it fit in c_space
  8149.     m.fname = partialfname(m.fname, c_space - 1)
  8150.     m.addelipse = .F.
  8151.     DO WHILE TXTWIDTH(m.fname+'...',m.g_thermfface,m.g_thermfsize,m.g_thermfstyle) > c_space
  8152.         m.fname = LEFT(m.fname, LEN(m.fname) - 1)
  8153.         m.addelipse = .T.
  8154.     ENDDO
  8155.     IF m.addelipse
  8156.         m.fname = m.fname + "..."
  8157.    ENDIF
  8158. ENDIF
  8159. RETURN m.fname
  8160.  
  8161.  
  8162.  
  8163. *!*****************************************************************************
  8164. *!
  8165. *!      Procedure: PARTIALFNAME
  8166. *!
  8167. *!*****************************************************************************
  8168. FUNCTION partialfname
  8169. PARAMETER m.filname, m.fillen
  8170. * Return a filname no longer than m.fillen characters.  Take some chars
  8171. * out of the middle if necessary.  No matter what m.fillen is, this function
  8172. * always returns at least the file stem and extension.
  8173. PRIVATE m.bname, m.elipse, m.remain
  8174. m.elipse = "..." + m.g_pathsep
  8175. IF _MAC
  8176.     m.bname = SUBSTR(m.filname, RAT(":",m.filname)+1)
  8177. ELSE
  8178.     m.bname = justfname(m.filname)
  8179. ENDIF
  8180. DO CASE
  8181. CASE LEN(m.filname) <= m.fillen
  8182.    m.retstr = m.filname
  8183. CASE LEN(m.bname) + LEN(m.elipse) >= m.fillen
  8184.    m.retstr = m.bname
  8185. OTHERWISE
  8186.    m.remain = MAX(m.fillen - LEN(m.bname) - LEN(m.elipse), 0)
  8187.    IF _MAC
  8188.        m.retstr = LEFT(SUBSTR(m.filname,1,RAT(":",m.filname)-1),m.remain) ;
  8189.             +m.elipse+m.bname
  8190.    ELSE
  8191.          m.retstr = LEFT(justpath(m.filname),m.remain)+m.elipse+m.bname
  8192.    ENDIF
  8193. ENDCASE
  8194. RETURN m.retstr
  8195.  
  8196. **
  8197. ** Error Handling Code
  8198. **
  8199.  
  8200. *!*****************************************************************************
  8201. *!
  8202. *!      Procedure: ERRORHANDLER
  8203. *!
  8204. *!      Called by: GENSCRN.PRG
  8205. *!               : OPENPROJDBF()      (function  in GENSCRN.PRG)
  8206. *!               : PREPSCREENS()      (function  in GENSCRN.PRG)
  8207. *!               : CHECKPARAM()       (function  in GENSCRN.PRG)
  8208. *!               : PREPFILE           (procedure in GENSCRN.PRG)
  8209. *!               : CLOSEFILE          (procedure in GENSCRN.PRG)
  8210. *!               : GETPLATFORM()      (function  in GENSCRN.PRG)
  8211. *!               : REFRESHPREFS       (procedure in GENSCRN.PRG)
  8212. *!               : DISPATCHBUILD      (procedure in GENSCRN.PRG)
  8213. *!               : UPDPROCARRAY       (procedure in GENSCRN.PRG)
  8214. *!               : GENVALIDBODY       (procedure in GENSCRN.PRG)
  8215. *!               : GENWHENBODY        (procedure in GENSCRN.PRG)
  8216. *!               : ACTICLAUSE         (procedure in GENSCRN.PRG)
  8217. *!               : DEATCLAUSE         (procedure in GENSCRN.PRG)
  8218. *!               : SHOWCLAUSE         (procedure in GENSCRN.PRG)
  8219. *!               : GENOPENDBFS        (procedure in GENSCRN.PRG)
  8220. *!               : DOPLACECLAUSE      (procedure in GENSCRN.PRG)
  8221. *!               : FINDREADCLAUSES    (procedure in GENSCRN.PRG)
  8222. *!               : COMBINE            (procedure in GENSCRN.PRG)
  8223. *!
  8224. *!          Calls: CLEANUP            (procedure in GENSCRN.PRG)
  8225. *!               : ERRLOG             (procedure in GENSCRN.PRG)
  8226. *!               : ERRSHOW            (procedure in GENSCRN.PRG)
  8227. *!               : CLOSEFILE          (procedure in GENSCRN.PRG)
  8228. *!
  8229. *!*****************************************************************************
  8230. PROCEDURE errorhandler
  8231. *)
  8232. *) ERRORHANDLER - Error Processing Center.
  8233. *)
  8234. PARAMETERS m.msg, m.linenum, m.errcode
  8235. IF ERROR() = 22   && too many memory variables--just bomb out as fast as we can
  8236.    ON ERROR
  8237.    DO cleanup
  8238.    CANCEL
  8239. ENDIF
  8240.  
  8241. DO CASE
  8242. CASE errcode == "Minor"
  8243.    DO errlog WITH m.msg, m.linenum
  8244.    m.g_status = 1
  8245. CASE errcode == "Serious"
  8246.    DO errlog  WITH m.msg, m.linenum
  8247.    DO errshow WITH m.msg, m.linenum
  8248.    m.g_status = 2
  8249.    ON ERROR
  8250. CASE errcode == "Fatal"
  8251.    ON ERROR
  8252.    IF m.g_havehand = .T.
  8253.       DO errlog WITH m.msg, m.linenum
  8254.       DO closefile WITH m.g_orghandle
  8255.       DO closefile WITH m.g_tmphandle
  8256.    ENDIF
  8257.    DO errshow WITH m.msg, m.linenum
  8258.    IF WEXIST("Thermomete") AND WVISIBLE("Thermomete")
  8259.       RELEASE WINDOW thermometer
  8260.    ENDIF
  8261.    DO cleanup
  8262.    CANCEL
  8263. ENDCASE
  8264. RETURN
  8265.  
  8266. *!*****************************************************************************
  8267. *!
  8268. *!      Procedure: ESCHANDLER
  8269. *!
  8270. *!      Called by: BUILDENABLE        (procedure in GENSCRN.PRG)
  8271. *!
  8272. *!          Calls: BUILDDISABLE       (procedure in GENSCRN.PRG)
  8273. *!               : CLEANUP            (procedure in GENSCRN.PRG)
  8274. *!
  8275. *!*****************************************************************************
  8276. PROCEDURE eschandler
  8277. *)
  8278. *) ESCHANDLER - Escape handler.
  8279. *)
  8280. ON ERROR
  8281. WAIT WINDOW "Generation process stopped." NOWAIT
  8282. DO builddisable
  8283. IF m.g_havehand
  8284.    ERASE (m.g_outfile)
  8285.    ERASE (m.g_tmpfile)
  8286. ENDIF
  8287. IF WEXIST("Thermomete") AND WVISIBLE("Thermomete")
  8288.    RELEASE WINDOW thermometer
  8289. ENDIF
  8290. DO cleanup
  8291. CANCEL
  8292.  
  8293. *!*****************************************************************************
  8294. *!
  8295. *!      Procedure: ERRLOG
  8296. *!
  8297. *!      Called by: ERRORHANDLER       (procedure in GENSCRN.PRG)
  8298. *!
  8299. *!          Calls: OPENERRFILE        (procedure in GENSCRN.PRG)
  8300. *!
  8301. *!*****************************************************************************
  8302. PROCEDURE errlog
  8303. *)
  8304. *) ERRLOG - Save an error message in the error log file.
  8305. *)
  8306. PARAMETER m.msg, m.linenum
  8307. DO openerrfile
  8308.  
  8309. SET CONSOLE OFF
  8310. \\GENERATOR: <<ALLTRIM(m.msg)>>
  8311. IF NOT EMPTY(m.linenum)
  8312.    \\ LINE NUMBER: <<m.linenum>>
  8313. ENDIF
  8314. \
  8315. = FCLOSE(_TEXT)
  8316. _TEXT = m.g_orghandle
  8317. RETURN
  8318.  
  8319. *!*****************************************************************************
  8320. *!
  8321. *!      Procedure: ERRSHOW
  8322. *!
  8323. *!      Called by: ERRORHANDLER       (procedure in GENSCRN.PRG)
  8324. *!               : OPENERRFILE        (procedure in GENSCRN.PRG)
  8325. *!
  8326. *!*****************************************************************************
  8327. PROCEDURE errshow
  8328. *)
  8329. *) ERRSHOW - Show error in an alert box on the screen.
  8330. *)
  8331. PARAMETER m.msg, m.lineno
  8332. PRIVATE m.curcursor
  8333.  
  8334. IF m.g_graphic
  8335.     IF _MAC
  8336.        DEFINE WINDOW ALERT ;
  8337.           AT  INT((SROW() - (( 6.615 * ;
  8338.           FONTMETRIC(1, m.g_dlgface, m.g_dlgsize, m.g_dlgstyle )) / ;
  8339.           FONTMETRIC(1, WFONT(1,""), WFONT(2,""), WFONT(3,"")))) / 2), ;
  8340.           INT((SCOL() - (( 63.833 * ;
  8341.           FONTMETRIC(6, m.g_dlgface, m.g_dlgsize, m.g_dlgstyle )) / ;
  8342.           FONTMETRIC(6, WFONT(1,""), WFONT(2,""), WFONT(3,"")))) / 2) ;
  8343.           SIZE 6.615,63.833 ;
  8344.           FONT m.g_dlgface, m.g_dlgsize ;
  8345.           STYLE m.g_dlgstyle ;
  8346.           NOCLOSE ;
  8347.           DOUBLE ;
  8348.           TITLE "Genscrn Error" ;
  8349.           COLOR RGB(0, 0, 0, 255, 255, 255)
  8350.     ELSE
  8351.        DEFINE WINDOW ALERT ;
  8352.           AT  INT((SROW() - (( 6.615 * ;
  8353.           FONTMETRIC(1, m.g_dlgface, m.g_dlgsize, m.g_dlgstyle )) / ;
  8354.           FONTMETRIC(1, WFONT(1,""), WFONT(2,""), WFONT(3,"")))) / 2), ;
  8355.           INT((SCOL() - (( 63.833 * ;
  8356.           FONTMETRIC(6, m.g_dlgface, m.g_dlgsize, m.g_dlgstyle )) / ;
  8357.           FONTMETRIC(6, WFONT(1,""), WFONT(2,""), WFONT(3,"")))) / 2) ;
  8358.           SIZE 6.615,63.833 ;
  8359.           FONT m.g_dlgface, m.g_dlgsize ;
  8360.           STYLE m.g_dlgstyle ;
  8361.           NOCLOSE ;
  8362.           DOUBLE ;
  8363.           TITLE "Genscrn Error" ;
  8364.           COLOR RGB(0, 0, 0, 255, 255, 255)
  8365.    ENDIF
  8366.    MOVE WINDOW ALERT CENTER
  8367.    ACTIVATE WINDOW ALERT NOSHOW
  8368.  
  8369.    m.dispmsg = m.msg
  8370.    IF TXTWIDTH(m.dispmsg) > WCOLS()
  8371.       * Make sure it isn't too long.
  8372.       DO WHILE TXTWIDTH(m.dispmsg+'...') > WCOLS()
  8373.          m.dispmsg = LEFT(m.dispmsg,LEN(m.dispmsg)-1)
  8374.       ENDDO
  8375.       IF m.msg <> m.dispmsg    && Has display message been shortened?
  8376.          m.dispmsg = m.dispmsg + '...'
  8377.       ENDIF
  8378.    ENDIF
  8379.  
  8380.    @ 1,MAX((WCOLS()-TXTWIDTH( m.dispmsg ))/2,1) SAY m.dispmsg
  8381.  
  8382.    m.msg = "Genscrn Line Number: "+STR(m.lineno, 4)
  8383.    @ 2,(WCOLS()-TXTWIDTH( m.msg ))/2 SAY m.msg
  8384.  
  8385.    IF TYPE("m.g_screen") <> "U" AND m.g_screen <> 0
  8386.       m.msg = "Generating from: "+LOWER(g_screens[m.g_screen,1])
  8387.       @ 3,MAX((WCOLS()-TXTWIDTH( m.msg ))/2,1) SAY m.msg
  8388.    ENDIF
  8389.  
  8390.    m.msg = "Press any key to cleanup and exit..."
  8391.    @ 4,(WCOLS()-TXTWIDTH( m.msg ))/2 SAY m.msg
  8392.  
  8393.    SHOW WINDOW ALERT
  8394. ELSE
  8395.    DEFINE WINDOW ALERT;
  8396.       FROM INT((SROW()-7)/2), INT((SCOL()-50)/2) TO INT((SROW()-7)/2) + 6, INT((SCOL()-50)/2) + 50 ;
  8397.       FLOAT NOGROW NOCLOSE NOZOOM SHADOW DOUBLE;
  8398.       COLOR SCHEME 7
  8399.  
  8400.    ACTIVATE WINDOW ALERT
  8401.  
  8402.    @ 0,0 CLEAR
  8403.    @ 1,0 SAY PADC(SUBSTR(m.msg,1,44)+;
  8404.       IIF(LEN(m.msg)>44,"...",""), WCOLS())
  8405.    @ 2,0 SAY PADC("Line Number: "+STR(m.lineno, 4), WCOLS())
  8406.  
  8407.    IF TYPE("m.g_screen") <> "U" AND m.g_screen <> 0
  8408.       m.msg = "Working on screen: "+LOWER(g_screens[m.g_screen])
  8409.       @ 3,0 SAY PADC(m.msg,WCOLS())
  8410.    ENDIF
  8411.  
  8412.    @ 4,0 SAY PADC("Press any key to cleanup and exit...", WCOLS())
  8413. ENDIF
  8414.  
  8415. m.curcursor = SET( "CURSOR" )
  8416. SET CURSOR OFF
  8417.  
  8418. WAIT ""
  8419.  
  8420. RELEASE WINDOW ALERT
  8421. SET CURSOR &curcursor
  8422.  
  8423. RELEASE WINDOW ALERT
  8424. RETURN
  8425.  
  8426. *!*****************************************************************************
  8427. *!
  8428. *!      Procedure: OPENERRFILE
  8429. *!
  8430. *!      Called by: ERRLOG             (procedure in GENSCRN.PRG)
  8431. *!
  8432. *!          Calls: ERRSHOW            (procedure in GENSCRN.PRG)
  8433. *!
  8434. *!*****************************************************************************
  8435. PROCEDURE openerrfile
  8436. *)
  8437. *) OPENERRFILE - Open error file.
  8438. *)
  8439. PRIVATE m.errfile, m.errhandle
  8440. m.errfile   = m.g_errlog+".ERR"
  8441. m.errhandle = FOPEN(m.errfile,2)
  8442. IF m.errhandle < 0
  8443.    m.errhandle = FCREATE(m.errfile)
  8444.    IF m.errhandle < 0
  8445.       DO errshow WITH ".ERR could not be opened...", LINENO()
  8446.       m.g_status = 2
  8447.       IF WEXIST("Thermomete") AND WVISIBLE("Thermomete")
  8448.          RELEASE WINDOW thermometer
  8449.       ENDIF
  8450.       ON ERROR
  8451.       RETURN TO MASTER
  8452.    ENDIF
  8453. ELSE
  8454.    = FSEEK(m.errhandle,0,2)
  8455. ENDIF
  8456. IF SET("TEXTMERGE") = "OFF"
  8457.    SET TEXTMERGE ON
  8458. ENDIF
  8459. _TEXT = m.errhandle
  8460.  
  8461. *!*****************************************************************************
  8462. *!
  8463. *!      Procedure: PUSHINDENT
  8464. *!
  8465. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  8466. *!               : EMITBRACKET        (procedure in GENSCRN.PRG)
  8467. *!               : PLACESAYS          (procedure in GENSCRN.PRG)
  8468. *!               : GENWINDEFI         (procedure in GENSCRN.PRG)
  8469. *!
  8470. *!*****************************************************************************
  8471. PROCEDURE pushindent
  8472. *)
  8473. *) PUSHINDENT - Add another indentation level
  8474. *)
  8475. _PRETEXT = CHR(9) + _PRETEXT
  8476. RETURN
  8477.  
  8478. *!*****************************************************************************
  8479. *!
  8480. *!      Procedure: POPINDENT
  8481. *!
  8482. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  8483. *!               : EMITBRACKET        (procedure in GENSCRN.PRG)
  8484. *!               : PLACESAYS          (procedure in GENSCRN.PRG)
  8485. *!               : GENWINDEFI         (procedure in GENSCRN.PRG)
  8486. *!
  8487. *!*****************************************************************************
  8488. PROCEDURE popindent
  8489. *)
  8490. *) POPINDENT - Remove one indentation level
  8491. *)
  8492. IF LEFT(_PRETEXT,1) = CHR(9)
  8493.    _PRETEXT = SUBSTR(_PRETEXT,2)
  8494. ENDIF
  8495. RETURN
  8496.  
  8497. *!*****************************************************************************
  8498. *!
  8499. *!      Procedure: COUNTPLATFORMS
  8500. *!
  8501. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  8502. *!
  8503. *!*****************************************************************************
  8504. FUNCTION countplatforms
  8505. *)
  8506. *) COUNTPLATFORMS - Count the number of platforms in this SCX that are in common across
  8507. *)                    all the SCXs in this screen set.
  8508. *)
  8509. PRIVATE m.cnt, m.i
  8510. IF TYPE("g_platforms") <> "U"
  8511.    m.cnt = 0
  8512.    FOR m.i = 1 TO ALEN(g_platforms)
  8513.       IF !EMPTY(g_platforms[m.i])
  8514.          m.cnt = m.cnt + 1
  8515.       ENDIF
  8516.    ENDFOR
  8517.    RETURN m.cnt
  8518. ENDIF
  8519. RETURN 0
  8520.  
  8521. *!*****************************************************************************
  8522. *!
  8523. *!      Function: LOOKUPPLATFORM
  8524. *!
  8525. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  8526. *!
  8527. *!*****************************************************************************
  8528. FUNCTION lookupplatform
  8529. *)
  8530. *) LOOKUPPLATFORM - Return the n-th platform name
  8531. *)
  8532. PARAMETER m.n
  8533. IF TYPE("g_platforms") <> "U" AND ALEN(g_platforms) >= m.n ;
  8534.       AND m.n > 0 AND TYPE("g_platforms[m.n]") = "C"
  8535.    RETURN UPPER(g_platforms[m.n])
  8536. ENDIF
  8537. RETURN ""
  8538.  
  8539. *!*****************************************************************************
  8540. *!
  8541. *!      Function: HASRECORDS
  8542. *!
  8543. *!*****************************************************************************
  8544. FUNCTION hasrecords
  8545. *)
  8546. *) HASRECORDS - Return .T. if plat records are in the screen.
  8547. *)
  8548. PARAMETER m.plat
  8549. IF TYPE("g_platforms") = "U"
  8550.    RETURN IIF(m.plat = "DOS",.T.,.F.)
  8551. ELSE
  8552.    RETURN IIF(ASCAN(g_platforms,m.plat) > 0,.T.,.F.)
  8553. ENDIF
  8554. RETURN
  8555.  
  8556. *!*****************************************************************************
  8557. *!
  8558. *!       Function: GETPARAM
  8559. *!
  8560. *!      Called by: CHECKPARAM()       (function  in GENSCRN.PRG)
  8561. *!
  8562. *!          Calls: ISCOMMENT()        (function  in GENSCRN.PRG)
  8563. *!               : WORDNUM()          (function  in GENSCRN.PRG)
  8564. *!               : MATCH()            (function  in GENSCRN.PRG)
  8565. *!
  8566. *!*****************************************************************************
  8567. FUNCTION getparam
  8568. *)
  8569. *) GETPARAM - Return the PARAMETER statement from a setup snippet, if one is there
  8570. *)
  8571. PARAMETER m.snipname
  8572. PRIVATE m.i, m.thisparam, m.numlines, m.thisline, m.word1, m.contin
  8573.  
  8574. * Do a quick check to see if we need to search further.
  8575. IF ATC("PARA",&snipname) = 0
  8576.    RETURN ""
  8577. ENDIF
  8578.  
  8579. m.numlines = MEMLINES(&snipname)
  8580. _MLINE = 0
  8581. m.i = 1
  8582. DO WHILE m.i <= m.numlines
  8583.    m.thisline = UPPER(LTRIM(MLINE(&snipname, 1, _MLINE)))
  8584.    DO killcr WITH m.thisline
  8585.  
  8586.    * Drop any double-ampersand comment
  8587.    IF AT(m.g_dblampersand,m.thisline) > 0
  8588.       m.thisline = LEFT(m.thisline,AT(m.g_dblampersand,m.thisline)-1)
  8589.    ENDIF
  8590.  
  8591.    IF !EMPTY(m.thisline) AND !iscomment(@thisline)
  8592.       * See if the first non-blank, non-comment, non-directive, non-EXTERNAL
  8593.       * line is a #SECTION 1
  8594.       DO CASE
  8595.       CASE LEFT(m.thisline,5) = "#SECT" AND AT('1',m.thisline) <> 0
  8596.          * Read until we find a #SECTION 2, the end of the snippet or a
  8597.          * PARAMETER statement.
  8598.          DO WHILE m.i <= m.numlines
  8599.             m.thisline = UPPER(LTRIM(MLINE(&snipname, 1, _MLINE)))
  8600.             DO killcr WITH m.thisline
  8601.  
  8602.             * Drop any double-ampersand comment
  8603.             IF AT(m.g_dblampersand,m.thisline) > 0
  8604.                m.thisline = LEFT(m.thisline,AT(m.g_dblampersand,m.thisline)-1)
  8605.             ENDIF
  8606.  
  8607.             m.word1 = wordnum(CHRTRAN(m.thisline,CHR(9)+';',' '),1)
  8608.             DO CASE
  8609.             CASE match(m.word1,"PARAMETERS")
  8610.  
  8611.                * Replace tabs with spaces
  8612.                m.thisline = LTRIM(CHRTRAN(m.thisline,CHR(9)," "))
  8613.  
  8614.                * Process continuation lines.  Replace tabs in incoming lines with spaces.
  8615.                DO WHILE RIGHT(RTRIM(m.thisline),1) = ';'
  8616.                   m.thisline = m.thisline + ' '+ CHR(13)+CHR(10)+CHR(9)
  8617.                   m.contin = MLINE(&snipname, 1, _MLINE)
  8618.                   DO killcr WITH m.contin
  8619.                   m.contin = CHRTRAN(LTRIM(m.contin),CHR(9)," ")
  8620.                   m.thisline = m.thisline + UPPER(m.contin)
  8621.                ENDDO
  8622.  
  8623.                * Clean up the parameters so that minor differences in
  8624.                * spacing don't cause the comparisons to fail.
  8625.  
  8626.                * Take the parameters but not the PARAMETER keyword itself
  8627.                m.thisparam = SUBSTR(m.thisline,AT(' ',m.thisline)+1)
  8628.                DO WHILE INLIST(LEFT(m.thisparam,1),CHR(10),CHR(13),CHR(9),' ')
  8629.                   m.thisparam = SUBSTR(m.thisparam,2)
  8630.                ENDDO
  8631.  
  8632.                * Force single spacing in the param string
  8633.                DO WHILE AT('  ',m.thisparam) > 0
  8634.                   m.thisparam = STRTRAN(m.thisparam,'  ',' ')
  8635.                ENDDO
  8636.  
  8637.                * Drop "m." designations so that they don't make the variables look different
  8638.                m.thisparam = STRTRAN(m.thisparam,'m.','')
  8639.                m.thisparam = STRTRAN(m.thisparam,'m->','')
  8640.  
  8641.                RETURN LOWER(m.thisparam)
  8642.             CASE LEFT(m.thisline,5) = "#SECT" AND AT('2',m.thisline) <> 0
  8643.                * No parameter statement, since we found #SECTION 2 first
  8644.                RETURN ""
  8645.             ENDCASE
  8646.             m.i = m.i + 1
  8647.          ENDDO
  8648.       CASE LEFT(m.thisline,1) = "#"   && some other directive
  8649.          * Do nothing.  Get next line.
  8650.       CASE match(wordnum(m.thisline,1),"EXTERNAL")
  8651.          * Ignore it.  This doesn't disqualify a later statement from being a PARAMETER
  8652.          * statement.
  8653.       OTHERWISE
  8654.          * no #SECTION 1, so no parameters
  8655.          RETURN ""
  8656.       ENDCASE
  8657.    ENDIF
  8658.    m.i = m.i + 1
  8659. ENDDO
  8660. RETURN ""
  8661.  
  8662.  
  8663. *!*****************************************************************************
  8664. *!
  8665. *!       Function: MATCH
  8666. *!
  8667. *!      Called by: EXTRACTPROCS       (procedure in GENSCRN.PRG)
  8668. *!               : EMITPROC           (procedure in GENSCRN.PRG)
  8669. *!               : PUTPROC            (procedure in GENSCRN.PRG)
  8670. *!               : GETFIRSTPROC()     (function  in GENSCRN.PRG)
  8671. *!               : UPDPROCARRAY       (procedure in GENSCRN.PRG)
  8672. *!               : ISPARAMETER()      (function  in GENSCRN.PRG)
  8673. *!               : OKTOGENERATE()     (function  in GENSCRN.PRG)
  8674. *!               : GETPARAM()         (function  in GENSCRN.PRG)
  8675. *!
  8676. *!*****************************************************************************
  8677. FUNCTION match
  8678. *)
  8679. *) MATCH - Returns TRUE is candidate is a valid 4-or-more-character abbreviation of keyword
  8680. *)
  8681. PARAMETER m.candidate, m.keyword
  8682. PRIVATE m.in_exact, m.retlog
  8683.  
  8684. m.in_exact = SET("EXACT")
  8685. SET EXACT OFF
  8686. DO CASE
  8687. CASE EMPTY(m.candidate)
  8688.    m.retlog = EMPTY(m.keyword)
  8689. CASE LEN(m.candidate) < 4
  8690.    m.retlog = IIF(m.candidate == m.keyword,.T.,.F.)
  8691. OTHERWISE
  8692.    m.retlog = IIF(m.keyword = m.candidate,.T.,.F.)
  8693. ENDCASE
  8694. IF m.in_exact != "OFF"
  8695.    SET EXACT ON
  8696. ENDIF
  8697.  
  8698. RETURN m.retlog
  8699.  
  8700. *!*****************************************************************************
  8701. *!
  8702. *!       Function: WORDNUM
  8703. *!
  8704. *!      Called by: EXTRACTPROCS       (procedure in GENSCRN.PRG)
  8705. *!               : EMITPROC           (procedure in GENSCRN.PRG)
  8706. *!               : PUTPROC            (procedure in GENSCRN.PRG)
  8707. *!               : GETFIRSTPROC()     (function  in GENSCRN.PRG)
  8708. *!               : UPDPROCARRAY       (procedure in GENSCRN.PRG)
  8709. *!               : GENINSERTCODE      (procedure in GENSCRN.PRG)
  8710. *!               : ISPARAMETER()      (function  in GENSCRN.PRG)
  8711. *!               : OKTOGENERATE()     (function  in GENSCRN.PRG)
  8712. *!               : GETPARAM()         (function  in GENSCRN.PRG)
  8713. *!
  8714. *!*****************************************************************************
  8715. FUNCTION wordnum
  8716. *)
  8717. *) WORDNUM - Returns w_num-th word from string strg
  8718. *)
  8719. PARAMETERS m.strg,m.w_num
  8720. PRIVATE strg,s1,w_num,ret_str
  8721.  
  8722. m.s1 = ALLTRIM(m.strg)
  8723.  
  8724. * Replace tabs with spaces
  8725. m.s1 = CHRTRAN(m.s1,CHR(9)," ")
  8726.  
  8727. * Reduce multiple spaces to a single space
  8728. DO WHILE AT('  ',m.s1) > 0
  8729.    m.s1 = STRTRAN(m.s1,'  ',' ')
  8730. ENDDO
  8731.  
  8732. ret_str = ""
  8733. DO CASE
  8734. CASE m.w_num > 1
  8735.    DO CASE
  8736.    CASE AT(" ",m.s1,m.w_num-1) = 0   && No word w_num.  Past end of string.
  8737.       m.ret_str = ""
  8738.    CASE AT(" ",m.s1,m.w_num) = 0     && Word w_num is last word in string.
  8739.       m.ret_str = SUBSTR(m.s1,AT(" ",m.s1,m.w_num-1)+1,255)
  8740.    OTHERWISE                         && Word w_num is in the middle.
  8741.       m.strt_pos = AT(" ",m.s1,m.w_num-1)
  8742.       m.ret_str  = SUBSTR(m.s1,strt_pos,AT(" ",m.s1,m.w_num)+1 - strt_pos)
  8743.    ENDCASE
  8744. CASE m.w_num = 1
  8745.    IF AT(" ",m.s1) > 0               && Get first word.
  8746.       m.ret_str = SUBSTR(m.s1,1,AT(" ",m.s1)-1)
  8747.    ELSE                              && There is only one word.  Get it.
  8748.       m.ret_str = m.s1
  8749.    ENDIF
  8750. ENDCASE
  8751. RETURN ALLTRIM(m.ret_str)
  8752.  
  8753.  
  8754. *!*****************************************************************************
  8755. *!
  8756. *!       Function: GETCNAME
  8757. *!
  8758. *!      Called by: SETCLAUSEFLAGS     (procedure in GENSCRN.PRG)
  8759. *!               : ORCLAUSEFLAGS      (procedure in GENSCRN.PRG)
  8760. *!               : ANYVALID           (procedure in GENSCRN.PRG)
  8761. *!               : ANYWHEN            (procedure in GENSCRN.PRG)
  8762. *!               : ANYMESSAGE         (procedure in GENSCRN.PRG)
  8763. *!               : ANYERROR           (procedure in GENSCRN.PRG)
  8764. *!
  8765. *!*****************************************************************************
  8766. FUNCTION getcname
  8767. *) GETCNAME - Generates a name for a clause.  Will take name from a
  8768. *)              generator directive stored in a snippet if present,
  8769. *)              or generates a generic name otherwise.  The name is
  8770. *)              designated by a #NAME name directive
  8771. *)
  8772. PARAMETERS m.snippet
  8773. PRIVATE dirname
  8774. IF ATC("#NAME",m.snippet) > 0
  8775.    m.dirname = MLINE(m.snippet, ATCLINE('#NAME',m.snippet))
  8776.    DO killcr WITH m.dirname
  8777.    m.dirname = UPPER(ALLTRIM(SUBSTR(m.dirname,AT(' ',m.dirname)+1)))
  8778.    IF !EMPTY(m.dirname)
  8779.       RETURN m.dirname
  8780.    ENDIF
  8781. ENDIF
  8782. RETURN LOWER(SYS(2015))
  8783.  
  8784. *!*****************************************************************************
  8785. *!
  8786. *!      Procedure: NOTEAREA
  8787. *!
  8788. *!      Called by: OPENPROJDBF()      (function  in GENSCRN.PRG)
  8789. *!               : PREPSCREENS()      (function  in GENSCRN.PRG)
  8790. *!
  8791. *!*****************************************************************************
  8792. PROCEDURE notearea
  8793. *)
  8794. *) NOTEAREA - Note that we are using this area so that we can clean up at exit
  8795. *)
  8796. g_areas[m.g_areacount] = SELECT()
  8797. m.g_areacount = m.g_areacount + 1
  8798. RETURN
  8799.  
  8800. *!*****************************************************************************
  8801. *!
  8802. *!      Procedure: CLEARAREAS
  8803. *!
  8804. *!      Called by: CLEANUP            (procedure in GENSCRN.PRG)
  8805. *!
  8806. *!*****************************************************************************
  8807. PROCEDURE clearareas
  8808. *)
  8809. *) CLEARAREAS - Clear the ones we opened.
  8810. *)
  8811. FOR i = 1 TO m.g_areacount
  8812.    SELECT g_areas[m.i]
  8813.    USE
  8814. ENDFOR
  8815. RETURN
  8816.  
  8817. *!*****************************************************************************
  8818. *!
  8819. *!      Procedure: INITTICK
  8820. *!
  8821. *!      Called by: GENSCRN.PRG
  8822. *!
  8823. *!*****************************************************************************
  8824. PROCEDURE inittick
  8825. *)
  8826. *) INITTICK, TICK, and TOCK - Profiling functions
  8827. *)
  8828. IF TYPE("ticktock") = "U"
  8829.    PUBLIC ticktock[10]
  8830. ENDIF
  8831. ticktock = 0
  8832. RETURN
  8833.  
  8834. *!*****************************************************************************
  8835. *!
  8836. *!       Function: TICK
  8837. *!
  8838. *!      Called by: GENSCRN.PRG
  8839. *!               : GENSECT1           (procedure in GENSCRN.PRG)
  8840. *!               : GENSECT2           (procedure in GENSCRN.PRG)
  8841. *!               : FINDSECTION()      (function  in GENSCRN.PRG)
  8842. *!               : WRITECODE          (procedure in GENSCRN.PRG)
  8843. *!               : BUILDFMT           (procedure in GENSCRN.PRG)
  8844. *!
  8845. *!*****************************************************************************
  8846. FUNCTION tick
  8847. *)
  8848. *) INITTICK, TICK, and TOCK - Profiling functions
  8849. *)
  8850. PARAMETER m.bucket
  8851. ticktock[bucket] = ticktock[bucket] - SECONDS()
  8852. RETURN
  8853.  
  8854. *!*****************************************************************************
  8855. *!
  8856. *!       Function: TOCK
  8857. *!
  8858. *!      Called by: CLEANUP            (procedure in GENSCRN.PRG)
  8859. *!               : GENSECT1           (procedure in GENSCRN.PRG)
  8860. *!               : GENSECT2           (procedure in GENSCRN.PRG)
  8861. *!               : FINDSECTION()      (function  in GENSCRN.PRG)
  8862. *!               : WRITECODE          (procedure in GENSCRN.PRG)
  8863. *!               : BUILDFMT           (procedure in GENSCRN.PRG)
  8864. *!
  8865. *!*****************************************************************************
  8866. FUNCTION tock
  8867. *)
  8868. *) INITTICK, TICK, and TOCK - Profiling functions
  8869. *)
  8870. PARAMETER m.bucket
  8871. ticktock[bucket] = ticktock[bucket] + SECONDS()
  8872. RETURN
  8873.  
  8874. *!*****************************************************************************
  8875. *!
  8876. *!      Procedure: PUTMSG
  8877. *!
  8878. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  8879. *!               : GENCLEANUP         (procedure in GENSCRN.PRG)
  8880. *!               : GENPROCEDURES      (procedure in GENSCRN.PRG)
  8881. *!               : EXTRACTPROCS       (procedure in GENSCRN.PRG)
  8882. *!               : UPDPROCARRAY       (procedure in GENSCRN.PRG)
  8883. *!               : GENSECT1           (procedure in GENSCRN.PRG)
  8884. *!               : BUILDFMT           (procedure in GENSCRN.PRG)
  8885. *!
  8886. *!*****************************************************************************
  8887. PROCEDURE putmsg
  8888. *)
  8889. *) Display a status message on the status bar at the bottom of the screen
  8890. *)
  8891. PARAMETER m.msg
  8892. IF m.g_graphic
  8893.    SET MESSAGE TO msg
  8894. ENDIF
  8895.  
  8896. *!*****************************************************************************
  8897. *!
  8898. *!       Function: VERSIONCAP
  8899. *!
  8900. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  8901. *!               : GENCLEANUP         (procedure in GENSCRN.PRG)
  8902. *!               : UPDPROCARRAY       (procedure in GENSCRN.PRG)
  8903. *!               : GENSECT1           (procedure in GENSCRN.PRG)
  8904. *!               : BUILDFMT           (procedure in GENSCRN.PRG)
  8905. *!               : COMMENTBLOCK       (procedure in GENSCRN.PRG)
  8906. *!
  8907. *!*****************************************************************************
  8908. FUNCTION versioncap
  8909. *)
  8910. *) VERSIONCAP - Return platform name suitable for display
  8911. *)
  8912. PARAMETER m.strg, m.dual
  8913. DO CASE
  8914. CASE m.strg = "DOS"
  8915.    m.retstrg = "MS-DOS"
  8916.     IF m.dual
  8917.        m.retstrg = m.retstrg + " and UNIX"
  8918.     ENDIF
  8919. CASE m.strg = "WINDOWS"
  8920.    m.retstrg = "Windows"
  8921.     IF m.dual
  8922.        m.retstrg = m.retstrg + " and Macintosh"
  8923.     ENDIF
  8924. CASE m.strg = "MAC"
  8925.    m.retstrg = "Macintosh"
  8926.     IF m.dual
  8927.        m.retstrg = m.retstrg + " and Windows"
  8928.     ENDIF
  8929. CASE m.strg = "UNIX"
  8930.    m.retstrg = "UNIX"
  8931.     IF m.dual
  8932.        m.retstrg = m.retstrg + " and MS-DOS"
  8933.     ENDIF
  8934. OTHERWISE
  8935.    m.retstrg = m.strg
  8936. ENDCASE
  8937. RETURN m.retstrg
  8938.  
  8939. *!*****************************************************************************
  8940. *!
  8941. *!       Function: MULTIPLAT
  8942. *!
  8943. *!      Called by: DISPATCHBUILD      (procedure in GENSCRN.PRG)
  8944. *!               : GENCLEANUP         (procedure in GENSCRN.PRG)
  8945. *!               : GENPROCEDURES      (procedure in GENSCRN.PRG)
  8946. *!               : GENSECT1           (procedure in GENSCRN.PRG)
  8947. *!               : BUILDFMT           (procedure in GENSCRN.PRG)
  8948. *!
  8949. *!*****************************************************************************
  8950. FUNCTION multiplat
  8951. *)
  8952. *) MULTIPLAT - Returns TRUE if we are generating for multiple platforms
  8953. *)
  8954. RETURN IIF(m.g_allplatforms AND m.g_numplatforms > 1, .T. , .F.)
  8955.  
  8956. *!*****************************************************************************
  8957. *!
  8958. *!      Procedure: SEEKHEADER
  8959. *!
  8960. *!      Called by: GENCLEANUP         (procedure in GENSCRN.PRG)
  8961. *!               : GENPROCEDURES      (procedure in GENSCRN.PRG)
  8962. *!               : GENSECT1           (procedure in GENSCRN.PRG)
  8963. *!               : GENSECT2           (procedure in GENSCRN.PRG)
  8964. *!               : GENRELATIONS       (procedure in GENSCRN.PRG)
  8965. *!               : BUILDFMT           (procedure in GENSCRN.PRG)
  8966. *!               : GENGIVENREAD       (procedure in GENSCRN.PRG)
  8967. *!
  8968. *!*****************************************************************************
  8969. PROCEDURE seekheader
  8970. *)
  8971. *) SEEKHEADER - Find the header for this screen/platform
  8972. *)
  8973. PARAMETER m.i
  8974. IF g_screens[m.i,6]
  8975.    GO TOP
  8976. ELSE
  8977.    LOCATE FOR platform = g_screens[m.i,7] AND objtype = c_otscreen
  8978. ENDIF
  8979. RETURN
  8980.  
  8981. *!*****************************************************************************
  8982. *!
  8983. *!       Function: GETPLATNAME
  8984. *!
  8985. *!      Called by: GENCLEANUP         (procedure in GENSCRN.PRG)
  8986. *!               : GENPROCEDURES      (procedure in GENSCRN.PRG)
  8987. *!               : GENSECT1           (procedure in GENSCRN.PRG)
  8988. *!               : GENSECT2           (procedure in GENSCRN.PRG)
  8989. *!               : GENVALIDBODY       (procedure in GENSCRN.PRG)
  8990. *!               : GENWHENBODY        (procedure in GENSCRN.PRG)
  8991. *!               : ACTICLAUSE         (procedure in GENSCRN.PRG)
  8992. *!               : DEATCLAUSE         (procedure in GENSCRN.PRG)
  8993. *!               : SHOWCLAUSE         (procedure in GENSCRN.PRG)
  8994. *!
  8995. *!*****************************************************************************
  8996. FUNCTION getplatname
  8997. *)
  8998. *) GETPLATNAME - Return the platform for a screen
  8999. *)
  9000. PARAMETER m.plnum
  9001. IF g_screens[m.plnum,6]
  9002.    RETURN "DOS"
  9003. ELSE
  9004.    RETURN platform
  9005. ENDIF
  9006. RETURN
  9007.  
  9008.  
  9009. *!*****************************************************************************
  9010. *!
  9011. *!      Procedure: INSERTFILE
  9012. *!
  9013. *!      Called by: GENINSERTCODE      (procedure in GENSCRN.PRG)
  9014. *!
  9015. *!          Calls: WRITECODE          (procedure in GENSCRN.PRG)
  9016. *!
  9017. *!*****************************************************************************
  9018. PROCEDURE insertfile
  9019. PARAMETER m.incfn, m.scrnno, m.insetup, m.platname
  9020. PRIVATE m.oldals, m.insdbfname, m.oldmline, m.fptname
  9021.  
  9022. * Search for the file in the current directory, along the FoxPro path, and along
  9023. * the DOS path.
  9024. IF !FILE(m.incfn)
  9025.    DO CASE
  9026.    CASE FILE(FULLPATH(m.incfn))
  9027.       m.incfn = FULLPATH(m.incfn)
  9028.    CASE FILE(FULLPATH(m.incfn,1))
  9029.       m.incfn = FULLPATH(m.incfn,1)
  9030.    ENDCASE
  9031. ENDIF
  9032.  
  9033. IF FILE((m.incfn))
  9034.    m.oldals = ALIAS()
  9035.    m.insdbfname = SYS(3)+".DBF"
  9036.    m.oldmline = _MLINE
  9037.  
  9038.    * The following lines create a temporary file with a single memo field
  9039.    * and appends the inserted file into the memo field. Effectively creating
  9040.    * a code snippet. This allows the standard procedure for generating code
  9041.    * snippets to be call to process the inserted file. This in turn allows
  9042.    * the include file to contain generator directives.
  9043.    CREATE TABLE (m.insdbfname) (inscode m)
  9044.    APPEND BLANK
  9045.    APPEND MEMO inscode FROM (m.incfn)
  9046.  
  9047.    \** Start of inserted file <<m.incfn>> <<REPLICATE(m.g_horiz,32)+"start">>
  9048.  
  9049.    * Make a recursive call to the standard snippet generation procedure
  9050.    DO writecode WITH inscode, m.platname, 1, 0, m.scrnno, m.insetup
  9051.  
  9052.    \** End of inserted file <<m.incfn>> <<REPLICATE(m.g_horiz,36)+"end">>
  9053.    \
  9054.  
  9055.    USE
  9056.    DELETE FILE (m.insdbfname)
  9057.    m.fptname = forceext(m.insdbfname,"FPT")
  9058.    IF FILE(m.fptname)
  9059.       DELETE FILE (m.fptname)
  9060.    ENDIF
  9061.  
  9062.    SELECT (m.oldals)
  9063.    _MLINE=oldmline
  9064. ELSE
  9065.    \*
  9066.    \* Inserted file <<m.incfn>> not found!
  9067.    \*
  9068. ENDIF
  9069. RETURN
  9070.  
  9071. *!*****************************************************************************
  9072. *!
  9073. *!      Function: VERSNUM
  9074. *!
  9075. *!*****************************************************************************
  9076. FUNCTION versnum
  9077. * Return string corresponding to FoxPro version number
  9078. RETURN wordnum(vers(),2)
  9079.  
  9080.  
  9081. *!*****************************************************************************
  9082. *!
  9083. *!      Function: SHOWSTAT
  9084. *!
  9085. *!*****************************************************************************
  9086. PROCEDURE showstat
  9087. PARAMETER m.strg
  9088. WAIT WINDOW m.strg NOWAIT
  9089. RETURN
  9090.  
  9091. *!*****************************************************************************
  9092. *!
  9093. *!      Function: KILLCR
  9094. *!
  9095. *!*****************************************************************************
  9096. PROCEDURE killcr
  9097. PARAMETER m.strg
  9098. IF _MAC
  9099.    m.strg = CHRTRAN(m.strg,CHR(13)+CHR(10),"")
  9100. ENDIF
  9101. RETURN
  9102.  
  9103. *!*****************************************************************************
  9104. *!
  9105. *!      Function: ASSERT
  9106. *!
  9107. *!*****************************************************************************
  9108. FUNCTION assert
  9109. PARAMETER m.bool, m.strg
  9110. IF !m.bool
  9111.    WAIT WINDOW m.strg
  9112. ENDIF
  9113.  
  9114. *!*****************************************************************************
  9115. *!
  9116. *!      Function: BITMAPSTR
  9117. *!
  9118. *!*****************************************************************************
  9119. FUNCTION bitmapstr
  9120. * Return a string of bitmap file extensions, suitable for LOCFILE, etc.
  9121. PARAMETER whichone
  9122. DO CASE
  9123. CASE whichone = c_all AND _MAC
  9124.    RETURN '"'+m.g_picext+"|"+m.g_bmpext+"|"+m.g_icnext+"|"+m.g_icoext+'"'
  9125. CASE whichone = c_all AND !_MAC
  9126.    RETURN '"'+m.g_bmpext+"|"+m.g_icoext+"|"+m.g_picext+"|"+m.g_icnext+'"'
  9127. OTHERWISE
  9128.    RETURN '"'+IIF(_MAC,m.g_picext,m.g_bmpext)+'"'
  9129. ENDCASE
  9130.  
  9131. *!*****************************************************************************
  9132. *!
  9133. *!      Function: ICONSTR
  9134. *!
  9135. *!*****************************************************************************
  9136. FUNCTION iconstr
  9137. DO CASE
  9138. CASE _MAC
  9139.     RETURN m.g_icnext
  9140. OTHERWISE
  9141.     RETURN m.g_icoext
  9142. ENDCASE
  9143.  
  9144. *!*****************************************************************************
  9145. *!
  9146. *!      Function: STYLE2NUM
  9147. *!
  9148. *!*****************************************************************************
  9149. FUNCTION style2num
  9150. * Translate a font style string to its equivalent numerical representation
  9151. PARAMETER m.strg
  9152. PRIVATE m.i, m.num
  9153. m.num = 0
  9154. m.strg= UPPER(ALLTRIM(m.strg))
  9155. FOR m.i = 1 TO LEN(m.strg)
  9156.    DO CASE
  9157.    CASE SUBSTR(m.strg,i,1) = "B"      && bold
  9158.       m.num = m.num + 1
  9159.    CASE SUBSTR(m.strg,i,1) = "I"         && italic
  9160.       m.num = m.num + 2
  9161.    CASE SUBSTR(m.strg,i,1) = "U"      && underlined
  9162.       m.num = m.num + 4
  9163.    CASE SUBSTR(m.strg,i,1) = "O"      && outline
  9164.       m.num = m.num + 8
  9165.    CASE SUBSTR(m.strg,i,1) = "S"      && shadow
  9166.       m.num = m.num + 16
  9167.    CASE SUBSTR(m.strg,i,1) = "C"         && condensed
  9168.       m.num = m.num + 32
  9169.    CASE SUBSTR(m.strg,i,1) = "E"      && extended
  9170.       m.num = m.num + 64
  9171.    CASE SUBSTR(m.strg,i,1) = "-"      && strikeout
  9172.       m.num = m.num + 128
  9173.    ENDCASE
  9174. ENDFOR
  9175. RETURN m.num
  9176.  
  9177. *!*****************************************************************************
  9178. *!
  9179. *!      Function: NUM2STYLE
  9180. *!
  9181. *!*****************************************************************************
  9182. FUNCTION num2style
  9183. * Translate a font style number to its equivalent string representation
  9184. PARAMETER m.num
  9185. PRIVATE m.i, m.strg, m.pow, m.stylechars, m.outstrg
  9186. m.strg = ""
  9187. * These are the style characters.  Their position in the string matches the bit
  9188. * position in the num byte.
  9189. m.stylechars = "BIUOSCE-"
  9190.  
  9191. * Look at each of the bits in the num byte
  9192. FOR m.i = 8 TO 1 STEP -1
  9193.    m.pow = ROUND(2^(i-1),0)
  9194.     IF m.num >= m.pow
  9195.        m.strg = m.strg + SUBSTR(stylechars,m.i,1)
  9196.     ENDIF
  9197.     m.num = m.num % m.pow
  9198. ENDFOR
  9199.  
  9200. * Now reverse the string so that style codes appear in the traditional order
  9201. m.outstrg = ""
  9202. FOR m.i = 1 TO LEN(m.strg)
  9203.    m.outstrg = m.outstrg + SUBSTR(m.strg,LEN(m.strg)+1-m.i,1)
  9204. ENDFOR
  9205. RETURN m.outstrg
  9206.  
  9207.  
  9208. FUNCTION ctrlclause
  9209. PARAMETER m.pictstrg
  9210. * Return the control portion of a picture string
  9211. m.pictstrg = LTRIM(m.pictstrg)
  9212. m.spos = AT(' ',m.pictstrg)
  9213. IF m.spos > 1
  9214.     IF INLIST(LEFT(m.pictstrg,1),'"',"'")
  9215.        m.pictstrg = STRTRAN(m.pictstrg,LEFT(m.pictstrg,1),"")
  9216.     ENDIF
  9217.    RETURN ALLTRIM(LEFT(m.pictstrg,m.spos - 1))
  9218. ELSE
  9219.    RETURN m.pictstrg
  9220. ENDIF
  9221.  
  9222.  
  9223. *: EOF: GENSCRN.PRG
  9224.