home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 5 / 05.iso / a / a093 / 1.ddi / FOXPROW.MS_ / FOXPROW.bin
Encoding:
Text File  |  1993-01-17  |  45.4 KB  |  1,511 lines

  1. '**************************************************************************
  2. '*                       FoxPro/Windows Installation
  3. '**************************************************************************
  4.  
  5. '$INCLUDE 'setup.inc'
  6.  
  7. DECLARE FUNCTION GetProgMgrGrps LIB "mscuistf.dll" AS INTEGER
  8. DECLARE FUNCTION QuietConfigUpdate LIB "mscuistf.dll" AS INTEGER
  9. DECLARE FUNCTION CanFindConfigSys LIB "mscuistf.dll" AS INTEGER
  10. DECLARE FUNCTION CalcListSize LIB "mscuistf.dll" AS LONG
  11. DECLARE FUNCTION WindowWidth LIB "mscuistf.dll" (iWind%) AS INTEGER
  12. DECLARE FUNCTION WindowHeight LIB "mscuistf.dll" (iWind%) AS INTEGER
  13. DECLARE FUNCTION AddLabelRecords LIB "mscuistf.dll" (foxuser$, label$) AS INTEGER
  14. DECLARE FUNCTION BuildUpdateFlag LIB "mscuistf.dll" (iFlags%, iSetting%) AS INTEGER
  15. DECLARE FUNCTION UpdateConfigFPW LIB "mscuistf.dll" (iFlags%, dest$, foxprowcfg$) AS INTEGER
  16.  
  17. ''Local functions and procedures.
  18. DECLARE SUB AddLabels
  19. DECLARE SUB AddToPM
  20. DECLARE SUB CheckDiskSpace
  21. DECLARE SUB ConfirmQuit
  22. DECLARE SUB DoRestart
  23. DECLARE SUB Install
  24. DECLARE SUB Get20Compatibility
  25. DECLARE SUB GetAdminPathInfo
  26. DECLARE SUB GetPathInfo
  27. DECLARE SUB GetPathGrpInfo
  28. DECLARE SUB GetUserAll
  29. DECLARE SUB GetUserInfo
  30. DECLARE SUB SetSectionSize
  31. DECLARE SUB UpdateConfig
  32. DECLARE SUB UpdateFPConfig
  33. DECLARE SUB UpdateINI
  34. DECLARE SUB WarnBadName
  35. DECLARE SUB WarnBadOrg
  36.  
  37. DECLARE FUNCTION CheckNoDosProd () AS STRING
  38. DECLARE FUNCTION CheckNoWinProd () AS STRING
  39. DECLARE FUNCTION ConfirmNameOrg () AS STRING
  40. DECLARE FUNCTION EnoughSpace () AS STRING
  41. DECLARE FUNCTION GetInstallOptions () AS STRING
  42. DECLARE FUNCTION GetInstallType () AS STRING
  43. DECLARE FUNCTION MakePath (szDir$, szFile$) AS STRING
  44. DECLARE FUNCTION SetInstall (szType$) AS STRING
  45. DECLARE FUNCTION SectionSize (szSection$) AS STRING
  46. DECLARE FUNCTION WarnBadPath (dlg%) AS STRING
  47.  
  48.  
  49. ''Dialog ID's
  50. CONST ASKQUIT           = 200           ''Is the user certain they want to quit?
  51. CONST BADINI            = 4500            ''We couldn't read setup.ini.
  52. CONST BADMODE           = 2100          ''We aren't in Enhanced mode.
  53. CONST BADNAME           = 7700          ''The user has to enter a name.
  54. CONST BADPATH           = 6400          ''The target directory can't be written to.
  55. CONST BADPATHTOOLS      = 4400          ''The MSDEST$ directory is bad.
  56. CONST BILLBOARD         = 20000         ''Used to hold billboard bitmaps.
  57. CONST CANTFIND          = 3900          ''Can't find config.sys.
  58. CONST CANTQUIT          = 2300          ''Couldn't exit Windows.
  59. CONST CANTUPDATE        = 3500          ''Coulsn't update config.sys.
  60. CONST COMPATIBILITY     = 1600          ''Install aoptional config.fpw, etc.
  61. CONST CONFIRMINFO       = 7300          ''Is the name and organization ok?
  62. CONST CUSTOMINST        = 1100          ''Get type of installation.
  63. CONST DESTPATHADMIN     = 4300          ''Get the FoxPro and tools directories.
  64. CONST DESTPATH          = 300           ''Get target directory without a group.
  65. CONST DESTPATHGROUP     = 1000          ''Get target directory and group.
  66. CONST DICTIONARY        = 4100          ''Ask the user what dictionary to use.
  67. CONST DISKFULL          = 1700          ''Not enough disk space is available.
  68. CONST DISKWINFULL       = 3100          ''Not enough space on Windows drive.
  69. CONST DOSPRODUCT        = 1900          ''A DOS FoxPro is in the target directory.
  70. CONST DRIVEMAP            = 4600            ''Add-ons are mapped to a different drive than FP.
  71. CONST EDITCONFIG        = 2700          ''Review changes to config.sys
  72. CONST EDITMODE          = 3800          ''Select method of updating config.sys
  73. CONST EDITOK            = 3700          ''We updated config.sys
  74. CONST EXITADMINOK       = 2500          ''We finished ok from admin type install.
  75. CONST EXITFAILURE       = 400           ''We are quiting due to an error.
  76. CONST EXITNOICON        = 2800          ''We installed, but don't have an icon.
  77. CONST EXITSUCCESS       = 700           ''We have successfully finished.
  78. CONST EXITQUIT          = 600           ''We were forced to quit by the user.
  79. CONST GETNAMEORG        = 1300          ''Get the user's name and organization.
  80. CONST NOT386            = 1800          ''Machine is less than a 386SX.
  81. CONST OPTIONS           = 800           ''Basic type of installation.
  82. CONST OPTSERVER         = 2900          ''Type of installation including server.
  83. CONST OPTCLIENT         = 3000          ''Type of installation including workstation.
  84. CONST REINSTALL         = 2000          ''Copy disincentive message.
  85. CONST RESTARTWIN        = 2200          ''Warn before restarting windows.
  86. CONST WAITINI           = 2400          ''Wait while updating INI files.
  87. CONST WAITSPACE         = 1500          ''Wait while getting free disk space.
  88. CONST WINPRODUCT        = 4200          ''Overwrite another copy of the executable?
  89.  
  90. CONST REQFILES          = 1
  91. CONST WINHELP           = 2
  92. CONST FPHELP            = 3
  93. CONST TUTORIAL          = 4
  94. CONST FOXAPP            = 6
  95. CONST EXAMPLES          = 5
  96. CONST FOXDOC            = 7
  97. CONST MSGRAPH           = 8
  98. CONST SPELL             = 9
  99. CONST SYSFILES          = 10
  100. CONST SETUP             = 11
  101. CONST WINFILES          = 12
  102.  
  103. CONST KEYCOMPDOS        = 1
  104. CONST KEYCOMPWIN        = 2
  105. CONST SPELLUS           = 3
  106. CONST SPELLUK           = 4
  107.  
  108. CONST CONFIG$           = "config.fpw"                  ''Name of config file we will write
  109. CONST DBFBAK$           = "foxuser.dbk"                 ''Name used to backup foxuser.dbf.
  110. CONST DIRINI$            = "setup\paths.ini"                ''Records tools location
  111. CONST FPTBAK$           = "foxuser.fpk"                 ''Name used to backup foxuser.fpt.
  112. CONST DESCRIP$          = "FoxPro for Windows"          ''Program Manager item name.
  113. CONST CUIDLL$           = "mscuistf.dll"                ''The .DLL containing our dialog routines.
  114. CONST INIFILE$          = "setup.ini"                   ''Name of the .INI file to brand.
  115. CONST LOGO              = 1                             ''Logo Bitmap ID.
  116. CONST LASTRESORT$       = "Setup was damaged.  Please call Microsoft product support."
  117. CONST LASTTITLE$        = "Setup Error"
  118. CONST MINFILES%         = 40
  119. CONST NOGROUP$          = "- NONE -"                    ''Group name which means don't create a group.
  120. CONST QA$               = "psskb.txt"                   ''Name of QA file.
  121. CONST QADES$            = "FoxPro Q&A"                  ''PM Description.
  122. CONST README$           = "readme.txt"                  ''Name of README file.
  123. CONST READMEDES$        = "FoxPro Readme"               ''PM Description.
  124. CONST SAVECONFIG$       = "config.old"                  ''What to call existing config if backing up
  125.  
  126. GLOBAL BRAND%           ''Used to warn us that we didn't brand product during copy.
  127. GLOBAL DEST$            ''Default destination directory.
  128. GLOBAL fEXE%            ''Installing the executable?
  129. GLOBAL fGRAPH%          ''Flag indicating if MS Graph is going to be installed.
  130. GLOBAL FLAGS%           ''Flags passed to UpdateConfigFPW().
  131. GLOBAL fSPELL%          ''Flag indicating if the spell checker is to be installed.
  132. GLOBAL fWIN30%          ''Flag indicating if we are running under 3.0
  133. GLOBAL GROUP$           ''Default destination group.
  134. GLOBAL MSDEST$          ''MS Tools destination directory.
  135. GLOBAL SRCDIR$          ''Location of install files.
  136. GLOBAL SIZESSET%        ''Have we recorded the section sizes yet?
  137. GLOBAL WINDIR$          ''Windows directory.
  138. GLOBAL WINSYSDIR$       ''Windows system directory.
  139.  
  140. INIT:
  141.     ON ERROR GOTO QUIT
  142.  
  143.     BRAND%          = 0
  144.     DEST$           = "c:\foxprow"
  145.     DLG%            = 0
  146.     fEXE%           = 0
  147.     fWIN30%         = 0
  148.     fGRAPH%         = 0
  149.     fSPELL%         = 0
  150.     FLAGS%          = BuildUpdateFlag(0,0)
  151.     GROUP$          = "FoxPro for Windows"
  152.     MSDEST$         = MakePath(GetWindowsDir(), "msapps")
  153.     PMGROUPS%       = 0
  154.     SIZESET%        = 0
  155.     SRCDIR$         = GetSymbolValue("STF_SRCDIR")
  156.     WINDIR$         = GetWindowsDir()
  157.     WINSYSDIR$      = GetWindowsSysDir()
  158.  
  159.     x% = SetTimeValue(2,50,0)
  160.  
  161.     FOR x% = 1 TO WINFILES STEP 1
  162.         IF x% <> SETUP THEN
  163.             AddListItem "CheckItems", "ON"
  164.         ELSE
  165.             AddListItem "CheckItems", "OFF"
  166.         ENDIF
  167.         AddListItem "CheckItemsSize", "0"
  168.         AddListItem "WinDriveSize", "0"
  169.     NEXT
  170.  
  171.     SetBitmap CUIDLL$, LOGO
  172.  
  173.     SetTitle "Microsoft FoxPro for Windows Setup"
  174.     SetAbout "Microsoft FoxPro for Windows", "(c) 1985 - 1993 Microsoft Corporation"
  175.     SetSymbolValue "NoGroup", NOGROUP$
  176.     SetSymbolValue "FoxProGroup", GROUP$
  177.  
  178.     szInf$ = GetSymbolValue("STF_SRCINFPATH")
  179.     IF szInf$ = "" THEN
  180.     szInf$ = GetSymbolValue("STF_CWDDIR") + "FOXPROW.INF"
  181.     END IF
  182.     ReadInfFile szInf$
  183.  
  184. ''
  185. '' Make sure we have at least a 386SX.
  186. ''
  187. IF GetProcessorType() < 3 THEN
  188.     PROCESSOR:
  189.     sz$ = UIStartDlg(CUIDLL$, NOT386, "FInfo0DlgProc", 0, "")
  190.     IF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
  191.         ConfirmQuit
  192.         GOTO PROCESSOR
  193.     END IF
  194.     UIPop 1
  195.     END
  196. END IF
  197.  
  198. ''
  199. '' Warn the user if we are not in Enhanced mode.
  200. ''
  201. IF GetWindowsMode() < 2 THEN
  202.     ENHANCED:
  203.         sz$ = UIStartDlg(CUIDLL$, BADMODE, "FQuitDlgProc", 0, "")
  204.         IF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
  205.             ConfirmQuit
  206.             GOTO ENHANCED
  207.         ELSE
  208.             UIPop 1
  209.         END IF
  210. END IF
  211.  
  212. ''
  213. '' For our own use, see if we are running on a version later than 3.0.  If
  214. '' so, try and get a list of the groups.
  215. ''
  216. IF GetWindowsMajorVersion() = 3 AND GetWindowsMinorVersion() = 0 THEN
  217.     fWIN30% = 1
  218. ELSE
  219.     PMGROUPS% = GetProgMgrGrps()
  220. END IF
  221.  
  222. ''
  223. '' Have the user specify their name and organization.
  224. ''
  225. x% = InitSystemRead(1, INIFILE$, 0)
  226.  
  227.     ''
  228.     '' We don't want the user to do a workstation installation if a sever
  229.     '' installation hasn't been done.  This check tries to catch the most
  230.     '' blatant transgressions by making sure that the executable exists in
  231.     '' the source directory.
  232.     ''
  233.     IF GetSymbolValue("STF_MODE") = "NETWORK" THEN
  234.         IF DoesFileExist(MakePath(SRCDIR$,"foxprow.exe"), femExists) = 0 THEN
  235.             SetSymbolValue "STF_MODE", "NORM"
  236.         END IF
  237.     END IF
  238.  
  239.     sz$ = GetSymbolValue("STF_CD_TYPE")
  240.     IF  sz$ = "NEW" OR sz$ = "WKST" OR sz$ = "USEDNAME" OR sz$ = "ORGUSED" THEN
  241.         GetUserInfo
  242.     ELSE
  243.         sz$ = UIStartDlg(CUIDLL$, BADINI, "FInfo0DlgProc", 0, "")
  244.         GOTO QUIT
  245.     END IF
  246.  
  247. ''
  248. '' Have the user specify where to put the product.  (Including the group if
  249. '' we can get the info.)
  250. ''
  251. GETTARGETINFO:
  252.     SetSymbolValue "FreeSpace", ""
  253.     SetSymbolValue "FreeSpaceWin", ""
  254.     IF GetSymbolValue("STF_MODE") = "ADMIN" THEN
  255.         GetAdminPathInfo
  256.     ELSEIF fWIN30% = 1 OR GetListLength("ListItemsIn") = 0 THEN
  257.         GetPathInfo
  258.     ELSE
  259.         GetPathGrpInfo
  260.     END IF
  261.  
  262.     CheckDiskSpace
  263.  
  264. ''
  265. '' Get the type of installation we are doing.
  266. ''
  267. IF GetSymbolValue("STF_MODE") = "NETWORK" THEN
  268.     y$ = SetInstall("WKST")
  269. ELSEIF GetSymbolValue("STF_MODE") = "ADMIN" THEN
  270.     y$ = SetInstall("ADMIN")
  271. ELSE
  272.     IF GetInstallType() = "CUSTOM" THEN
  273.         CUSTOMINSTALLATION:
  274.             IF GetInstallOptions() = "BACK" THEN
  275.                 GOTO GETTARGETINFO
  276.             END IF
  277.     END IF
  278. END IF
  279.  
  280. IF EnoughSpace() = "BACK" THEN
  281.     GOTO CUSTOMINSTALLATION
  282. END IF
  283.  
  284. ''
  285. '' See if the user wants DOS or Windows style keys.
  286. ''
  287. Get20Compatibility
  288.  
  289. ''
  290. '' Try to gaurantee that FILES are at least a minimum value.
  291. ''
  292. UpdateConfig
  293.  
  294. Install
  295.  
  296. IF ERR = STFQUIT THEN
  297.     DLG% = EXITQUIT
  298. ELSE
  299.     IF GetSymbolValue("STF_MODE") = "ADMIN" THEN
  300.         DLG% = EXITADMINOK
  301.     ELSE
  302.         DLG% = EXITSUCCESS
  303.     END IF
  304. END IF
  305. GOTO QUITL1
  306.  
  307. QUIT:
  308.     UIPopAll
  309.     IF ERR = STFPROGMAN THEN
  310.         DLG% = EXITNOICON
  311.     ELSEIF ERR = STFQUIT THEN
  312.         DLG% = EXITQUIT
  313.     ELSE
  314.         DLG% = EXITFAILURE
  315.     END IF
  316.  
  317. QUITL1:
  318.     ON ERROR GOTO TOAST
  319.  
  320.     sz$ = UIStartDlg(CUIDLL$, DLG%, "FQuitDlgProc", 0, "")
  321.     IF sz$ = "REACTIVATE" THEN
  322.     GOTO QUITL1
  323.     END IF
  324.     UIPop ALL
  325.  
  326.     IF BRAND%=1 AND DoesFileExist(MakePath(DEST$,"foxprow.exe"), femExists) = 1 THEN
  327.         CloseSystem "reqfiles", "prodfile", DEST$, 456, 123
  328.     END IF
  329.  
  330.     END
  331.  
  332. TOAST:
  333.     UIPopAll
  334.     i% = DoMsgBox(LASTRESORT$, LASTTITLE$, MB_OK+MB_TASKMODAL+MB_ICONHAND)
  335.     END
  336.  
  337. '**
  338. '** Purpose:
  339. '**     Copies the files in the copy list and adds FoxPro to the target
  340. '**             group if one was psecified.
  341. '** Arguments:
  342. '**     none.
  343. '** Returns:
  344. '**     none.
  345. '*************************************************************************
  346. SUB Install STATIC
  347.  
  348.     IF GetSymbolValue("STF_CD_TYPE") = "NEW" THEN
  349.         IF InitSystemWrite( 1, INIFILE$, 1 ) = 0 THEN
  350.             sz$ = UIStartDlg(CUIDLL$, BADINI, "FInfo0DlgProc", 0, "")
  351.             ERROR EXITFAILURE
  352.         END IF
  353.     END IF
  354.  
  355.     ''
  356.     '' Initialize the billboard
  357.     ''
  358.     ClearBillboardList
  359.     SetSymbolValue "BillboardList", ""
  360.     AddListItem "BillboardList", "F1"
  361.     AddListItem "BillboardList", "F2"
  362.     AddListItem "BillboardList", "F3"
  363.     AddListItem "BillboardList", "F4"
  364.     AddListItem "BillboardList", "F5"
  365.     AddListItem "BillboardList", "F6"
  366.     AddListItem "BillboardList", "F7"
  367.     AddListItem "BillboardList", "F8"
  368.     AddToBillboardList CUIDLL$, BILLBOARD, "FBillboardDlgProc", 1
  369.     IF GetSymbolValue("STF_MODE") <> "NETWORK" THEN
  370.         AddToBillboardList CUIDLL$, BILLBOARD, "FBillboardDlgProc", 1
  371.         AddToBillboardList CUIDLL$, BILLBOARD, "FBillboardDlgProc", 1
  372.         AddToBillboardList CUIDLL$, BILLBOARD, "FBillboardDlgProc", 1
  373.         AddToBillboardList CUIDLL$, BILLBOARD, "FBillboardDlgProc", 1
  374.         AddToBillboardList CUIDLL$, BILLBOARD, "FBillboardDlgProc", 1
  375.         AddToBillboardList CUIDLL$, BILLBOARD, "FBillboardDlgProc", 1
  376.         AddToBillboardList CUIDLL$, BILLBOARD, "FBillboardDlgProc", 1
  377.         SetSymbolValue "BillboardNumber", "1"
  378.     ELSE
  379.         SetSymbolValue "BillboardNumber", "8"
  380.     END IF
  381.  
  382.     SetCopyGaugePosition WindowWidth(HwndFrame())-158, WindowHeight(HwndFrame())-72
  383.  
  384.     ''
  385.     '' Remember that we need to brand the executable.
  386.     ''
  387.     IF GetSymbolValue("STF_MODE") <> "NETWORK" THEN
  388.         IF (fEXE% = 1 OR GetSymbolValue("STF_MODE") = "ADMIN") THEN
  389.             BRAND% = 1
  390.         END IF
  391.     END IF
  392.  
  393.     ''
  394.     '' Do the copy
  395.     ''
  396.     SetRestartDir GetSymbolValue("STF_CWDDIR")
  397.     CopyFilesInCopyList
  398.  
  399.     AddLabels
  400.     AddToPM
  401.     UpdateFPConfig
  402.     UpdateINI
  403.  
  404.     IF RestartListEmpty() = 0 THEN
  405.         DoRestart
  406.     END IF
  407.  
  408. END SUB
  409.  
  410. '**
  411. '** Purpose:
  412. '**     Creates the PM group and items(s).
  413. '** Arguments:
  414. '**     none.
  415. '** Returns:
  416. '**     none.
  417. '*************************************************************************
  418. SUB AddToPM STATIC
  419.     IF DoesDirExist(DEST$) = 0 THEN
  420.         CreateDir DEST$, cmoVital
  421.     END IF
  422.  
  423.     IF GROUP$ <> NOGROUP$ AND (fEXE% = 1 OR GetSymbolValue("STF_MODE") = "NETWORK") AND GetSymbolValue("STF_MODE") <> "ADMIN" THEN
  424.         CreateProgmanGroup GROUP$, "", cmoNone
  425.  
  426.         IF GetSymbolValue("STF_MODE") = "NETWORK" AND DoesFileExist(MakePath(SRCDIR$,"foxprow.exe"), femExists) = 1 THEN
  427.             IF fWIN30% = 1 THEN
  428.                 CreateProgmanItem GROUP$, DESCRIP$, MakePath(SRCDIR$,"foxprow.exe"), "", cmoOverwrite
  429.             ELSE
  430.                 CreateProgmanItem GROUP$, DESCRIP$, MakePath(SRCDIR$,"foxprow.exe"), MakePath(SRCDIR$,"foxprow.exe")+",0,0,0,"+DEST$, cmoOverwrite
  431.             ENDIF
  432.         ELSE
  433.             IF fWIN30% = 1 THEN
  434.                 CreateProgmanItem GROUP$, DESCRIP$, MakePath(DEST$,"foxprow.exe"), "", cmoOverwrite
  435.             ELSE
  436.                 CreateProgmanItem GROUP$, DESCRIP$, MakePath(DEST$,"foxprow.exe"), MakePath(DEST$,"foxprow.exe")+",0,0,0,"+DEST$, cmoOverwrite
  437.             ENDIF
  438.         END IF
  439.  
  440.         '' Add the readme file
  441.         IF GetSymbolValue("STF_MODE") = "NETWORK" THEN
  442.             IF DoesFileExist(MakePath(SRCDIR$,README$), femExists) = 1 THEN
  443.                 CreateProgmanItem GROUP$, READMEDES$, MakePath(SRCDIR$, README$), "", cmoOverwrite
  444.             END IF
  445.         ELSE
  446.             IF DoesFileExist(MakePath(DEST$,README$), femExists) = 1 THEN
  447.                 CreateProgmanItem GROUP$, READMEDES$, MakePath(DEST$, README$), "", cmoOverwrite
  448.             END IF
  449.         END IF
  450.  
  451.         '' Add the Q&A file
  452.         IF GetSymbolValue("STF_MODE") = "NETWORK" THEN
  453.             IF DoesFileExist(MakePath(SRCDIR$,QA$), femExists) = 1 THEN
  454.                 CreateProgmanItem GROUP$, QADES$, MakePath(SRCDIR$, QA$), "", cmoOverwrite
  455.             END IF
  456.         ELSE
  457.             IF DoesFileExist(MakePath(DEST$,QA$), femExists) = 1 THEN
  458.                 CreateProgmanItem GROUP$, QADES$, MakePath(DEST$, QA$), "", cmoOverwrite
  459.             END IF
  460.         END IF
  461.  
  462.         ShowProgmanGroup  GROUP$, 1, cmoNone
  463.     ENDIF
  464. END SUB
  465.  
  466. '**
  467. '** Purpose:
  468. '**     Adds label layouts to FoxUser, creating it if needed.
  469. '** Arguments:
  470. '**     none.
  471. '** Returns:
  472. '**     none.
  473. '*************************************************************************
  474. SUB AddLabels STATIC
  475.     IF DoesFileExist(MakePath(DEST$,"foxuser.dbf"), femExists) = 1 THEN
  476.         CopyFile MakePath(DEST$, "FOXUSER.DBF"), MakePath(DEST$, DBFBAK$), cmoOverwrite, 0
  477.         CopyFile MakePath(DEST$, "FOXUSER.FPT"), MakePath(DEST$, FPTBAK$), cmoOverwrite, 0
  478.         CopyFile MakePath(GetSymbolValue("STF_CWDDIR"),"FOXLABEL.DBF"), MakePath(DEST$,"FOXLABEL.DBF"), cmoOverwrite, 0
  479.         CopyFile MakePath(GetSymbolValue("STF_CWDDIR"),"FOXLABEL.FPT"), MakePath(DEST$,"FOXLABEL.FPT"), cmoOverwrite, 0
  480.         x% = AddLabelRecords(MakePath(DEST$,"FOXUSER.DBF"), MakePath(DEST$,"FOXLABEL.DBF"))
  481.         IF x% <> 0 THEN
  482.             CopyFile MakePath(DEST$, DBFBAK$), MakePath(DEST$,"FOXUSER.DBF"), cmoOverwrite, 0
  483.             CopyFile MakePath(DEST$, FPTBAK$), MakePath(DEST$,"FOXUSER.FPT"), cmoOverwrite, 0
  484.         ENDIF
  485.         RemoveFile MakePath(DEST$, DBFBAK$), cmpFprce
  486.         RemoveFile MakePath(DEST$, FPTBAK$), cmpFprce
  487.         RemoveFile MakePath(DEST$,"FOXLABEL.DBF"), cmoForce
  488.         RemoveFile MakePath(DEST$,"FOXLABEL.FPT"), cmoForce
  489.     ELSE
  490.         CopyFile MakePath(GetSymbolValue("STF_CWDDIR"),"FOXLABEL.DBF"), MakePath(DEST$,"FOXUSER.DBF"), cmoOverwrite, 0
  491.         CopyFile MakePath(GetSymbolValue("STF_CWDDIR"),"FOXLABEL.FPT"), MakePath(DEST$,"FOXUSER.FPT"), cmoOverwrite, 0
  492.     END IF
  493. END SUB
  494.  
  495. '**
  496. '** Purpose:
  497. '**     Updates the user's FoxPro configuration.
  498. '** Arguments:
  499. '**     none.
  500. '** Returns:
  501. '**     none.
  502. '*************************************************************************
  503. SUB UpdateFPConfig STATIC
  504.     IF GetSymbolValue("STF_MODE") <> "NETWORK" THEN
  505.         x% = UpdateConfigFPW(FLAGS%, DEST$, GetEnvVariableValue("FOXPROWCFG"))
  506.  
  507.         IF (fEXE% = 1 OR GetSymbolValue("STF_MODE") = "ADMIN") THEN
  508.             CloseSystem "reqfiles", "prodfile", DEST$, 456, 123
  509.             BRAND% = 0
  510.         END IF
  511.     END IF
  512. END SUB
  513.  
  514. '**
  515. '** Purpose:
  516. '**     Exits to DOS to update Window's system files which were in use.
  517. '** Arguments:
  518. '**     none.
  519. '** Returns:
  520. '**     none.
  521. '*************************************************************************
  522. SUB DoRestart STATIC
  523.     RESTARTBEGIN:
  524.         sz$ = UIStartDlg(CUIDLL$, RESTARTWIN, "FQuitDlgProc", 0, "")
  525.         IF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
  526.             ConfirmQuit
  527.             GOTO RESTARTBEGIN
  528.         END IF
  529.         UIPop 1
  530.  
  531.         TRYTOQUIT:
  532.         IF ExitExecRestart() = 0 THEN
  533.             TRYTOQUITL2:
  534.             sz$ = UIStartDlg(CUIDLL$, CANTQUIT, "FQuitDlgProc", 0, "")
  535.             IF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
  536.                 ConfirmQuit
  537.                 GOTO TRYTOQUITL2
  538.             END IF
  539.             GOTO TRYTOQUIT
  540.         END IF
  541. END SUB
  542.  
  543. '**
  544. '** Purpose:
  545. '**     Gets the user's name and organization as appropriate.
  546. '** Arguments:
  547. '**     none.
  548. '** Returns:
  549. '**     none.
  550. '*************************************************************************
  551. SUB GetUserInfo STATIC
  552.     IF GetSymbolValue("STF_MODE") <> "NETWORK" THEN
  553.         IF IsDriveNetwork(MID$(SRCDIR$, 1, 1)) <> 1 OR DoesFileExist(MakePath(SRCDIR$,"foxprow.exe"),femExists) <> 1 THEN
  554.             IF GetSymbolValue("STF_CD_TYPE") = "NEW" THEN
  555.                 GetUserAll
  556.             ELSE
  557.                 ''
  558.                 '' Copy Disincentive Dialog
  559.                 ''
  560.                 USEDDISKS:
  561.                     SetSymbolValue "ConfirmTextIn", ""
  562.                     AddListItem "ConfirmTextIn", GetSymbolValue( "STF_CD_NAME" )
  563.                     AddListItem "ConfirmTextIn", GetSymbolValue( "STF_CD_ORG" )
  564.  
  565.                     sz$ = UIStartDlg(CUIDLL$, REINSTALL, "FConfirmDlgProc", 0, "")
  566.                     IF sz$ = "EXIT" or sz$ = "CANCEL" THEN
  567.                         ConfirmQuit
  568.                         GOTO USEDDISKS
  569.                     END IF
  570.                     UIPop 1
  571.             END IF
  572.         END IF
  573.     END IF
  574.  
  575. END SUB
  576.  
  577. '**
  578. '** Purpose:
  579. '**     Gets both the user's name and organization.
  580. '** Arguments:
  581. '**     none.
  582. '** Returns:
  583. '**     none.
  584. '*************************************************************************
  585. SUB GetUserAll STATIC
  586.     szName$ = GetSymbolValue( "STF_CD_NAME" )
  587.     szOrg$ = GetSymbolValue( "STF_CD_ORG" )
  588.  
  589.     SetSymbolValue "NameIn", ""
  590.     SetSymbolValue "NameOut", ""
  591.     SetSymbolValue "OrgIn", ""
  592.     SetSymbolValue "OrgOut", ""
  593.     SetSymbolValue "ConfirmTextIn", ""
  594.  
  595.     AddListItem "NameIn", szName$
  596.     AddListItem "OrgIn", szOrg$
  597.     AddListItem "ConfirmTextIn", szName$
  598.     AddListItem "ConfirmTextIn", szOrg$
  599.  
  600.     NEWNAMEORG:
  601.         ReplaceListItem "NameIn", 1, szName$
  602.         ReplaceListItem "OrgIn", 1, szOrg$
  603.         sz$ = UIStartDlg(CUIDLL$, GETNAMEORG, "FNameOrgDlgProc", 0, "")
  604.         szName$ = RTRIM$(LTRIM$(GetSymbolValue("NameOut")))
  605.         szOrg$ = GetSymbolValue("OrgOut")
  606.         IF sz$ = "CONTINUE" THEN
  607.             IF LEN(szName$) = 0 THEN
  608.                 WarnBadName
  609.                 GOTO NEWNAMEORG
  610.             END IF
  611.             UIPop 1
  612.         ELSE
  613.             ConfirmQuit
  614.             GOTO NEWNAMEORG
  615.         END IF
  616.  
  617.         ReplaceListItem "ConfirmTextIn", 1, szName$
  618.         ReplaceListItem "ConfirmTextIn", 2, szOrg$
  619.         IF ConfirmNameOrg() = "BACK" THEN
  620.             ReplaceListItem "NameIn", 1, szName$
  621.             ReplaceListItem "OrgIn", 1, szOrg$
  622.             GOTO NEWNAMEORG
  623.         ENDIF
  624.  
  625.     SetSymbolValue "STF_CD_NAME", szName$
  626.     SetSymbolValue "STF_CD_ORG", szOrg$
  627.  
  628.     RemoveSymbol "ConfirmTextIn"
  629.     RemoveSymbol "NameIn"
  630.     RemoveSymbol "NameOut"
  631.     RemoveSymbol "OrgIn"
  632.     RemoveSymbol "OrgOut"
  633. END SUB
  634.  
  635. '**
  636. '** Purpose:
  637. '**     Has the user verify that the name and organization info is
  638. '**             acceptable.
  639. '** Arguments:
  640. '**     none.
  641. '** Returns:
  642. '**     none.
  643. '*************************************************************************
  644. FUNCTION ConfirmNameOrg () STATIC AS STRING
  645.     VALIDATENAMEORG:
  646.         sz$ = UIStartDlg(CUIDLL$, CONFIRMINFO, "FConfirmDlgProc", 0, "")
  647.         IF sz$ = "CONTINUE" THEN
  648.             ConfirmNameOrg = "CONTINUE"
  649.         ELSEIF sz$ = "BACK" THEN
  650.             ConfirmNameOrg = "BACK"
  651.         ELSE
  652.             ConfirmQuit
  653.             GOTO VALIDATENAMEORG
  654.         END IF
  655.  
  656.         UIPop 1
  657. END FUNCTION
  658.  
  659. '**
  660. '** Purpose:
  661. '**     Gets the path where the user wishes to install FoxPro and the
  662. '**             path for the Windows support routines.
  663. '** Arguments:
  664. '**     none.
  665. '** Returns:
  666. '**     none.
  667. '*************************************************************************
  668. SUB GetAdminPathInfo STATIC
  669.  
  670.     GETADMINPATHINFOSTART:
  671.         SetSymbolValue "NameIn", LCASE$(DEST$)
  672.         SetSymbolValue "NameOut", ""
  673.         SetSymbolValue "OrgIn", LCASE$(MSDEST$)
  674.         SetSymbolValue "OrgOut", ""
  675.  
  676.         sz$ = UIStartDlg(CUIDLL$, DESTPATHADMIN, "FNameOrgDlgProc", 0, "")
  677.         DEST$ = GetSymbolValue("NameOut")
  678.  
  679.         DEST$ = LCASE$(DEST$)
  680.         MSDEST$ = LCASE$(MSDEST$)
  681.  
  682.         IF MID$(DEST$, LEN(DEST$), 1) <> "\" THEN
  683.             DEST$ = DEST$ + "\"
  684.         END IF
  685.         MSDEST$ = GetSymbolValue("OrgOut")
  686.         IF MID$(MSDEST$, LEN(MSDEST$), 1) <> "\" THEN
  687.             MSDEST$ = MSDEST$ + "\"
  688.         END IF
  689.  
  690.         IF sz$ = "CONTINUE" THEN
  691.             IF IsDirWritable(DEST$) = 0 THEN
  692.             x$ = WarnBadPath(BADPATH)
  693.                 GOTO GETADMINPATHINFOSTART
  694.             END IF
  695.                 IF IsDirWritable(MSDEST$) = 0 THEN
  696.                     x$ = WarnBadPath(BADPATHTOOLS)
  697.                     GOTO GETADMINPATHINFOSTART
  698.                 END IF
  699.         ELSEIF sz$ = "REACTIVATE" THEN
  700.             GOTO GETADMINPATHINFOSTART
  701.         ELSE
  702.                 ConfirmQuit
  703.             GOTO GETADMINPATHINFOSTART
  704.         END IF
  705.  
  706.         IF LCASE$(MID$(DEST$, 1, 1)) <> LCASE$(MID$(MSDEST$, 1, 1)) THEN
  707.             GETDRIVECONFIRM:
  708.                 sz$ = UIStartDlg(CUIDLL$, DRIVEMAP, "FInfo0DlgProc", 0, "")
  709.                 IF sz$ = "BACK" THEN
  710.                     UIPop 1
  711.                     GOTO GETADMINPATHINFOSTART
  712.                 ELSEIF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
  713.                     ConfirmQuit
  714.                     GOTO GETDRIVECONFIRM
  715.                 END IF
  716.  
  717.                 UIPop 1
  718.         END IF
  719.  
  720.         IF CheckNoWinProd() = "BACK" THEN
  721.             GOTO GETADMINPATHINFOSTART
  722.         END IF
  723.  
  724.         IF CheckNoDosProd() = "BACK" THEN
  725.             GOTO GETADMINPATHINFOSTART
  726.         END IF
  727.  
  728.         UIPop 1
  729.  
  730.         RemoveSymbol "NameIn"
  731.         RemoveSymbol "NameOut"
  732.         RemoveSymbol "OrgIn"
  733.         RemoveSymbol "OrgOut"
  734. END SUB
  735.  
  736. '**
  737. '** Purpose:
  738. '**     Gets the path where the user wishes to install FoxPro.
  739. '** Arguments:
  740. '**     none.
  741. '** Returns:
  742. '**     none.
  743. '*************************************************************************
  744. SUB GetPathInfo STATIC
  745.  
  746.     SetSymbolValue "EditTextIn", LCASE$( DEST$ )
  747.     SetSymbolValue "EditFocus", "END"
  748.  
  749.     GETPATHINFOSTART:
  750.         sz$ = UIStartDlg(CUIDLL$, DESTPATH, "FEditDlgProc", 0, "")
  751.         DEST$ = GetSymbolValue("EditTextOut")
  752.         IF MID$(DEST$, LEN(DEST$), 1) = ":" THEN
  753.             DEST$ = DEST$ + "\"
  754.         END IF
  755.  
  756.     IF sz$ = "CONTINUE" THEN
  757.         IF IsDirWritable(DEST$) = 0 THEN
  758.         x$ = WarnBadPath(BADPATH)
  759.             GOTO GETPATHINFOSTART
  760.         END IF
  761.         ELSEIF sz$ = "REACTIVATE" THEN
  762.         GOTO GETPATHINFOSTART
  763.         ELSE
  764.             ConfirmQuit
  765.         GOTO GETPATHINFOSTART
  766.         END IF
  767.  
  768.         IF CheckNoWinProd() = "BACK" THEN
  769.             SetSymbolValue "EditTextIn", DEST$
  770.             GOTO GETPATHINFOSTART
  771.         END IF
  772.  
  773.         IF CheckNoDosProd() = "BACK" THEN
  774.             SetSymbolValue "EditTextIn", DEST$
  775.             GOTO GETPATHINFOSTART
  776.         END IF
  777.  
  778.         UIPop 1
  779.  
  780.         RemoveSymbol "EditTextIn"
  781.         RemoveSymbol "EditTextOut"
  782.         RemoveSymbol "EditFocus"
  783. END SUB
  784.  
  785. '**
  786. '** Purpose:
  787. '**     Gets the path and PM group where the user wishes to install FoxPro.
  788. '** Arguments:
  789. '**     none.
  790. '** Returns:
  791. '**     none.
  792. '*************************************************************************
  793. SUB GetPathGrpInfo () STATIC
  794.  
  795.     SetSymbolValue "EditTextIn", DEST$
  796.     SetSymbolValue "ListDefault", GROUP$
  797.  
  798.     GETPATHGRPINFOSTART:
  799.         sz$ = UIStartDlg(CUIDLL$, DESTPATHGROUP, "FDirGrpProc", 0, "")
  800.         DEST$ = GetSymbolValue("EditTextOut")
  801.         GROUP$ = GetSymbolValue("ListItemsOut")
  802.         IF MID$(DEST$, LEN(DEST$), 1) = ":" THEN
  803.             DEST$ = DEST$ + "\"
  804.         END IF
  805.  
  806.         IF sz$ = "CONTINUE" THEN
  807.             IF IsDirWritable(DEST$) = 0 THEN
  808.                 x$ = WarnBadPath(BADPATH)
  809.                 GOTO GETPATHGRPINFOSTART
  810.             END IF
  811.         ELSEIF sz$ = "REACTIVATE" THEN
  812.             GOTO GETPATHGRPINFOSTART
  813.         ELSE
  814.             ConfirmQuit
  815.             GOTO GETPATHGRPINFOSTART
  816.         END IF
  817.  
  818.         IF CheckNoWinProd() = "BACK" THEN
  819.             SetSymbolValue "EditTextIn", DEST$
  820.             SetSymbolValue "ListDefault", GROUP$
  821.             GOTO GETPATHGRPINFOSTART
  822.         END IF
  823.  
  824.         IF CheckNoDosProd() = "BACK" THEN
  825.             SetSymbolValue "EditTextIn", DEST$
  826.             SetSymbolValue "ListDefault", GROUP$
  827.             GOTO GETPATHGRPINFOSTART
  828.         END IF
  829.  
  830.         UIPop 1
  831.  
  832.         RemoveSymbol "EditTextIn"
  833.         RemoveSymbol "EditTextOut"
  834.         RemoveSymbol "ListDefault"
  835.         RemoveSymbol "ListItemsOut"
  836. END SUB
  837.  
  838. '**
  839. '** Purpose:
  840. '**     Checks to see if we are installing over another copy of FoxPro for
  841. '**             Windows and asks the user if they really want to do it.
  842. '** Arguments:
  843. '**     none.
  844. '** Returns:
  845. '**     none.
  846. '*************************************************************************
  847. FUNCTION CheckNoWinProd () STATIC AS STRING
  848.  
  849.     CHECKNOWIN:
  850.         IF DOESFILEEXIST( MakePath( DEST$, "FOXPROW.EXE" ), femExists ) = 1 THEN
  851.             HASWIN:
  852.                 sz$ = UIStartDlg(CUIDLL$, WINPRODUCT, "FInfo0DlgProc", 0, "")
  853.                 IF sz$ = "EXIT" OR sz$ = "CANCEL" THEN
  854.                     ConfirmQuit
  855.                     GOTO HASWIN
  856.                 ENDIF
  857.                 CheckNoWinProd = sz$
  858.  
  859.                 UIPop 1
  860.         ELSE
  861.             CheckNoWinProd = "CONTINUE"
  862.         ENDIF
  863. END FUNCTION
  864.  
  865.  
  866. '**
  867. '** Purpose:
  868. '**    Check to see if the installation directory contains a FoxPro for DOS and,
  869. '**        if so, let the user change their mind.
  870. '**
  871. '** Arguments:
  872. '**     none.
  873. '** Returns:
  874. '**     "CONTINUE" or "BACK" to indicate that we should go ahead and
  875. '**             install here or ask for another path.
  876. '*************************************************************************
  877. FUNCTION CheckNoDosProd () STATIC AS STRING
  878.  
  879.     CHECKNODOS:
  880.         IF DoesFileExist( MakePath( DEST$, "FOXPRO.EXE" ), femExists ) = 0 THEN
  881.         IF DoesFileExist( MakePath( DEST$, "FOXPROX.EXE" ), femExists ) = 0 THEN
  882.         IF DoesFileExist( MakePath( DEST$, "FOXPROL.EXE" ), femExists ) = 0 THEN
  883.         IF DoesFileExist( MakePath( DEST$, "FOXPROLX.EXE" ), femExists ) = 0 THEN
  884.             CheckNoDosProd = "CONTINUE"
  885.             GOTO CHECKNODOSEND
  886.         END IF
  887.         END IF
  888.         END IF
  889.         END IF
  890.  
  891.     CHECKNODOSMIDDLE:
  892.         sz$ = UIStartDlg(CUIDLL$, DOSPRODUCT, "FInfo0DlgProc", 0, "")
  893.         IF sz$ = "EXIT" or sz$ = "CANCEL" THEN
  894.             ConfirmQuit
  895.             GOTO CHECKNODOSMIDDLE
  896.         END IF
  897.  
  898.         UIPop 1
  899.         CheckNoDosProd = sz$
  900.  
  901.     CHECKNODOSEND:
  902. END FUNCTION
  903.  
  904. '**
  905. '** Purpose:
  906. '**     Fills the copy list with the sections the user wants to install
  907. '**             based on installation categories.
  908. '** Arguments:
  909. '**     none.
  910. '** Returns:
  911. '**     none.
  912. '*************************************************************************
  913. FUNCTION GetInstallType () STATIC AS STRING
  914.  
  915.     modeflg% = 0
  916.     dlg% = OPTIONS
  917.     IF GetSymbolValue("STF_MODE") = "ADMIN" OR IsDriveNetwork(MID$(DEST$, 1, 1)) = 1 THEN
  918.         modeflg% = 3
  919.         dlg% = OPTSERVER
  920.     ELSEIF GetSymbolValue("STF_MODE") = "NETWORK" OR ((IsDriveNetwork(MID$(SRCDIR$, 1, 1)) = 1 OR GetSymbolValue("STF_CD_TYPE") = "WKST") AND DoesFileExist(MakePath(SRCDIR$,"foxprow.exe"), femExists) = 1) THEN
  921.         modeflg% = 2
  922.         dlg% = OPTCLIENT
  923.     ELSE
  924.         modeflg% = 1
  925.         dlg% = OPTIONS
  926.     ENDIF
  927.  
  928.     GETINSTALLTYPESTART:
  929.     sz$ = UIStartDlg(CUIDLL$, dlg%, "FThreeOptDlgProc", 0, "")
  930.         IF sz$ = "ONE" THEN
  931.             UIPop 1
  932.             GetInstallType = "FULL"
  933.             SetSymbolValue "STF_MODE", "NORMAL"
  934.             y$ = SetInstall("MAX")
  935.     ELSEIF sz$ = "TWO" THEN
  936.             UIPop 1
  937.             GetInstallType = "CUSTOM"
  938.             SetSymbolValue "STF_MODE", "NORMAL"
  939.     ELSEIF sz$ = "THREE" THEN
  940.             UIPop 1
  941.             GetInstallType = "MINIMUM"
  942.  
  943.             IF modeflg% = 3 THEN
  944.                 SetSymbolValue "STF_MODE", "ADMIN"
  945.                 MSDEST$ = MakePath(DEST$, "setup\msapps")
  946.                 y$ = SetInstall("ADMIN")
  947.             ELSEIF modeflg% = 2 THEN
  948.                 SetSymbolValue "STF_MODE", "NETWORK"
  949.                 y$ = SetInstall("WKST")
  950.             ELSE
  951.                 y$ = SetInstall("MIN")
  952.             END IF
  953.         ELSE
  954.             ConfirmQuit
  955.             GOTO GETINSTALLTYPESTART
  956.     END IF
  957. END FUNCTION
  958.  
  959. '**
  960. '** Purpose:
  961. '**     Fills the copy list with the sections the user wants to install
  962. '**             based on selections from the available options.
  963. '** Arguments:
  964. '**     none.
  965. '** Returns:
  966. '**     none.
  967. '*************************************************************************
  968. FUNCTION GetInstallOptions () STATIC AS STRING
  969.  
  970.     GetInstallOptions = "CONTINUE"
  971.  
  972.     SetSymbolValue "Drive", UCASE$(MID$(DEST$, 1, 1)) + ":"
  973.     SetSymbolValue "WinDrive", UCASE$(MID$(WINSYSDIR$, 1, 1)) + ": (Windows)"
  974.  
  975.     GETINSTALLOPTIONSSTART:
  976.         sz$ = UIStartDlg(CUIDLL$, CUSTOMINST, "FCustInstDlgProc", 0, "")
  977.         IF sz$ = "CONTINUE" THEN
  978.             y$ = SetInstall("CUST")
  979.             UIPop 1
  980.         ELSEIF sz$ = "REACTIVATE" THEN
  981.             GOTO GETINSTALLOPTIONSSTART
  982.         ELSEIF sz$ = "BACK" THEN
  983.             UIPop 1
  984.             GetInstallOptions = "BACK"
  985.         ELSE
  986.             ConfirmQuit
  987.             GOTO GETINSTALLOPTIONSSTART
  988.         END IF
  989.  
  990. END FUNCTION
  991.  
  992. '**
  993. '** Purpose:
  994. '**     Sets the global copy list to install a the options selected by
  995. '**             the user as indicated by the list CheckItems.
  996. '** Arguments:
  997. '**     none.
  998. '** Returns:
  999. '**     none.
  1000. '*************************************************************************
  1001. FUNCTION SetInstall (szType$) STATIC AS STRING
  1002.  
  1003.     fEXE% = 2
  1004.     IF DoesFileExist(MakePath(SRCDIR$,DIRINI$), femExists) = 1 THEN
  1005.         ToolsLoc$ = GetIniKeyString(MakePath(SRCDIR$, DIRINI$), "TOOLS LOCATION", "DIR")
  1006.         IF MID$(ToolsLoc$, 1, 1) = "\" THEN
  1007.             ToolsLoc$ = MID$(SRCDIR$, 1, 1) + ":" + ToolsLoc$
  1008.         END IF
  1009.     ELSE
  1010.         ToolsLoc$ = ""
  1011.     END IF
  1012.  
  1013.     IF szType$ = "MAX" THEN
  1014.         ReplaceListItem "CheckItems", REQFILES, "ON"
  1015.         ReplaceListItem "CheckItems", WINHELP,  "ON"
  1016.         ReplaceListItem "CheckItems", FPHELP,   "ON"
  1017.         ReplaceListItem "CheckItems", TUTORIAL, "ON"
  1018.         ReplaceListItem "CheckItems", FOXAPP,   "ON"
  1019.         ReplaceListItem "CheckItems", EXAMPLES, "ON"
  1020.         ReplaceListItem "CheckItems", FOXDOC,   "ON"
  1021.         ReplaceListItem "CheckItems", MSGRAPH,  "ON"
  1022.         ReplaceListItem "CheckItems", SPELL,    "ON"
  1023.         ReplaceListItem "CheckItems", SYSFILES, "ON"
  1024.         ReplaceListItem "CheckItems", WINFILES, "ON"
  1025.         ReplaceListItem "CheckItems", SETUP,    "OFF"
  1026.         fEXE% = 1
  1027.  
  1028.     ELSEIF szType$ = "ADMIN" THEN
  1029.         ReplaceListItem "CheckItems", REQFILES, "ON"
  1030.         ReplaceListItem "CheckItems", WINHELP,  "ON"
  1031.         ReplaceListItem "CheckItems", FPHELP,   "ON"
  1032.         ReplaceListItem "CheckItems", TUTORIAL, "ON"
  1033.         ReplaceListItem "CheckItems", FOXAPP,   "ON"
  1034.         ReplaceListItem "CheckItems", EXAMPLES, "ON"
  1035.         ReplaceListItem "CheckItems", FOXDOC,   "ON"
  1036.         ReplaceListItem "CheckItems", MSGRAPH,  "ON"
  1037.         ReplaceListItem "CheckItems", SPELL,    "ON"
  1038.         ReplaceListItem "CheckItems", SYSFILES, "ON"
  1039.         ReplaceListItem "CheckItems", WINFILES, "ON"
  1040.         ReplaceListItem "CheckItems", SETUP,    "ON"
  1041.         fEXE% = 0
  1042.  
  1043.     ELSEIF szType$ = "MIN" THEN
  1044.         ReplaceListItem "CheckItems", REQFILES, "ON"
  1045.         ReplaceListItem "CheckItems", WINHELP,  "OFF"
  1046.         ReplaceListItem "CheckItems", FPHELP,   "OFF"
  1047.         ReplaceListItem "CheckItems", TUTORIAL, "OFF"
  1048.         ReplaceListItem "CheckItems", FOXAPP,   "OFF"
  1049.         ReplaceListItem "CheckItems", EXAMPLES, "OFF"
  1050.         ReplaceListItem "CheckItems", FOXDOC,   "OFF"
  1051.         ReplaceListItem "CheckItems", MSGRAPH,  "OFF"
  1052.         ReplaceListItem "CheckItems", SPELL,    "OFF"
  1053.         ReplaceListItem "CheckItems", SYSFILES, "ON"
  1054.         ReplaceListItem "CheckItems", WINFILES, "ON"
  1055.         ReplaceListItem "CheckItems", SETUP,    "OFF"
  1056.         fEXE% = 1
  1057.  
  1058.     ELSEIF szType$ = "WKST" THEN
  1059.         ReplaceListItem "CheckItems", REQFILES, "OFF"
  1060.         ReplaceListItem "CheckItems", WINHELP,  "OFF"
  1061.         ReplaceListItem "CheckItems", FPHELP,   "OFF"
  1062.         ReplaceListItem "CheckItems", TUTORIAL, "OFF"
  1063.         ReplaceListItem "CheckItems", FOXAPP,   "OFF"
  1064.         ReplaceListItem "CheckItems", EXAMPLES, "OFF"
  1065.         ReplaceListItem "CheckItems", FOXDOC,   "OFF"
  1066.         ReplaceListItem "CheckItems", MSGRAPH,  "OFF"
  1067.         ReplaceListItem "CheckItems", SPELL,    "OFF"
  1068.         ReplaceListItem "CheckItems", SYSFILES, "ON"
  1069.         ReplaceListItem "CheckItems", WINFILES, "ON"
  1070.         ReplaceListItem "CheckItems", SETUP,    "OFF"
  1071.         MSDEST$ = ToolsLoc$
  1072.         IF ToolsLoc$ <> "" THEN
  1073.             fGRAPH% = 1
  1074.             fSPELL% = 1
  1075.         END IF
  1076.         fEXE% = 1
  1077.  
  1078.     END IF
  1079.  
  1080.     ClearCopyList
  1081.  
  1082.     IF GetListItem("CheckItems", REQFILES) = "ON" THEN
  1083.         IF fEXE% = 2 THEN
  1084.             fEXE% = 1
  1085.         END IF
  1086.         AddSectionFilesToCopyList "reqfiles", SRCDIR$, DEST$
  1087.     ELSE
  1088.         IF fEXE% = 2 THEN
  1089.             fEXE% = 0
  1090.         END IF
  1091.     END IF
  1092.  
  1093.     IF GetListItem("CheckItems", WINHELP) = "ON" THEN
  1094.         AddSectionFilesToCopyList "winhelp", SRCDIR$, DEST$
  1095.     END IF
  1096.  
  1097.     IF GetListItem("CheckItems", FPHELP) = "ON" THEN
  1098.         AddSectionFilesToCopyList "fphelp", SRCDIR$, DEST$
  1099.     END IF
  1100.  
  1101.     IF GetListItem("CheckItems", TUTORIAL) = "ON" THEN
  1102.         AddSectionFilesToCopyList "tutorial", SRCDIR$, DEST$
  1103.     END IF
  1104.  
  1105.     IF GetListItem("CheckItems", FOXAPP) = "ON" THEN
  1106.         AddSectionFilesToCopyList "foxapp", SRCDIR$, DEST$
  1107.     END IF
  1108.  
  1109.     IF GetListItem("CheckItems", EXAMPLES) = "ON" THEN
  1110.         AddSectionFilesToCopyList "examples", SRCDIR$, DEST$
  1111.     END IF
  1112.  
  1113.     IF GetListItem("CheckItems", FOXDOC) = "ON" THEN
  1114.         AddSectionFilesToCopyList "foxdoc", SRCDIR$, DEST$
  1115.     END IF
  1116.  
  1117.     IF GetListItem("CheckItems", MSGRAPH) = "ON" THEN
  1118.         IF ToolsLoc$ <> "" THEN
  1119.             AddSectionFilesToCopyList "msgraph", ToolsLoc$, MakePath(MSDEST$, "msgraph")
  1120.         ELSE
  1121.             AddSectionFilesToCopyList "msgraph", SRCDIR$, MakePath(MSDEST$, "msgraph")
  1122.         END IF
  1123.         AddSectionFilesToCopyList "graphwiz", SRCDIR$, DEST$
  1124.         fGRAPH% = 1
  1125.     END IF
  1126.  
  1127.     IF GetListItem("CheckItems", SPELL) = "ON" THEN
  1128.         IF ToolsLoc$ <> "" THEN
  1129.             AddSectionFilesToCopyList "spell", ToolsLoc$, MakePath(MSDEST$, "proof")
  1130.         ELSE
  1131.             AddSectionFilesToCopyList "spell", SRCDIR$, MakePath(MSDEST$, "proof")
  1132.         END IF
  1133.         AddSectionFilesToCopyList "spellapp", SRCDIR$, DEST$
  1134.         fSPELL% = 1
  1135.     END IF
  1136.  
  1137.     IF GetListItem("CheckItems", SYSFILES) = "ON" THEN
  1138.         IF szType$ <> "ADMIN" THEN
  1139.             AddSectionFilesToCopyList "sysfiles", SRCDIR$, WINSYSDIR$
  1140.         ELSE
  1141.             AddSectionFilesToCopyList "sysfiles", SRCDIR$, MakePath(DEST$, "setup")
  1142.         END IF
  1143.     END IF
  1144.  
  1145.     IF GetListItem("CheckItems", WINFILES) = "ON" THEN
  1146.         IF szType$ <> "ADMIN" THEN
  1147.             AddSectionFilesToCopyList "winfiles", SRCDIR$, WINDIR$
  1148.         ELSE
  1149.             AddSectionFilesToCopyList "winfiles", SRCDIR$, MakePath(DEST$, "setup")
  1150.         END IF
  1151.     END IF
  1152.  
  1153.     IF GetListItem("CheckItems", SETUP) = "ON" THEN
  1154.         AddSectionFilesToCopyList "setup", SRCDIR$, DEST$
  1155.     END IF
  1156.  
  1157.     SetInstall = "OK"
  1158. END FUNCTION
  1159.  
  1160. '**
  1161. '** Purpose:
  1162. '**     Sets all the symbols we need to determine if the user has enough
  1163. '**             disk space.
  1164. '** Arguments:
  1165. '**     none.
  1166. '** Returns:
  1167. '**     none.
  1168. '*************************************************************************
  1169. SUB CheckDiskSpace STATIC
  1170.     oldCursor% = ShowWaitCursor()
  1171.     sz$ = UIStartDlg( CUIDLL$, WAITSPACE, "FNoWaitDlgProc", 0, "")
  1172.  
  1173.     IF SIZESET% = 0 THEN
  1174.         SetSectionSize
  1175.         SIZESET% = 1
  1176.     ENDIF
  1177.  
  1178.     SetSymbolValue "FreeSpace", STR$(GetFreeSpaceForDrive(MID$(DEST$, 1, 1)) / 1024)
  1179.     IF MID$(DEST$, 1, 1) <> MID$(WINSYSDIR$, 1, 1) THEN
  1180.         SetSymbolValue "FreeSpaceWin", STR$(GetFreeSpaceForDrive(MID$(WINSYSDIR$, 1, 1)) / 1024)
  1181.     ELSE
  1182.         SetSymbolValue "FreeSpaceWin", GetSymbolValue("FreeSpace")
  1183.     END IF
  1184.  
  1185.     RestoreCursor oldCursor%
  1186.     UIPop 1
  1187. END SUB
  1188.  
  1189. '**
  1190. '** Purpose:
  1191. '**     Determines if we have enough space to do the install.
  1192. '** Arguments:
  1193. '**     none.
  1194. '** Returns:
  1195. '**     "CONTINUE" or "BACK".
  1196. '*************************************************************************
  1197. FUNCTION EnoughSpace() STATIC AS STRING
  1198.     EnoughSpace = "CONTINUE"
  1199.  
  1200.     SpaceAvail& = VAL(GetSymbolValue("FreeSpace"))
  1201.     SpaceAvailWin& = VAL(GetSymbolValue("FreeSpaceWin"))
  1202.  
  1203.     SpaceNeed& = 0
  1204.     SpaceNeedWin& = 0
  1205.     FOR x% = 1 TO WINFILES
  1206.         IF GetListItem("CheckItems", x%) = "ON" THEN
  1207.             SpaceNeed& = SpaceNeed& + VAL(GetListItem("CheckItemsSize", x%))
  1208.             SpaceNeedWin& = SpaceNeedWin& + VAL(GetListItem("WinDriveSize", x%))
  1209.         END IF
  1210.     NEXT
  1211.  
  1212.     ''
  1213.     '' If Windows is on the drive we are installing to, combine
  1214.     '' the needed values.
  1215.     ''
  1216.     IF MID$(DEST$, 1, 1) = MID$(WINSYSDIR$, 1, 1) THEN
  1217.         SpaceNeed& = SpaceNeed& + SpaceNeedWin&
  1218.     END IF
  1219.  
  1220.     ''
  1221.     '' Check to see if we have room
  1222.     ''
  1223.     IF SpaceNeed& > SpaceAvail& THEN
  1224.         dialog% = DISKFULL
  1225.     ELSEIF SpaceNeedWin& > SpaceAvailWin& THEN
  1226.         dialog% = DISKWINFULL
  1227.     ELSE
  1228.         dialog% = 0
  1229.     END IF
  1230.  
  1231.     IF dialog% > 0 THEN
  1232.         NOROOM:
  1233.             sz$ = UIStartDlg(CUIDLL$, dialog%, "FQuitDlgProc", 0, "")
  1234.             IF sz$ = "BACK" THEN
  1235.                 EnoughSpace = "BACK"
  1236.             ELSEIF sz$ = "EXIT" or sz$ = "CANCEL" THEN
  1237.                 ConfirmQuit
  1238.                 GOTO NOROOM
  1239.             END IF
  1240.             UIPop 1
  1241.     END IF
  1242. END FUNCTION
  1243.  
  1244. '**
  1245. '** Purpose:
  1246. '**     Determines whether or not the user wishes to install the 2.0
  1247. '**             compaitibility files.
  1248. '** Arguments:
  1249. '**     none.
  1250. '** Returns:
  1251. '**     none.
  1252. '*************************************************************************
  1253. SUB Get20Compatibility STATIC
  1254.     IF GetSymbolValue( "STF_MODE" ) <> "NETWORK" THEN
  1255.         COMPATIBILITYSTART:
  1256.         sz$ = UIStartDlg(CUIDLL$, COMPATIBILITY, "FThreeOptDlgProc", 0, "")
  1257.  
  1258.             IF sz$ = "ONE" THEN
  1259.                 FLAGS% = BuildUpdateFlag(FLAGS%, KEYCOMPDOS)
  1260.             ELSEIF sz$ = "TWO" THEN
  1261.                 FLAGS% = BuildUpdateFlag(FLAGS%, KEYCOMPWIN)
  1262.             ELSE
  1263.                 ConfirmQuit
  1264.                 GOTO COMPATIBILITYSTART
  1265.             END IF
  1266.             UIPop 1
  1267.     END IF
  1268. END SUB
  1269.  
  1270. '**
  1271. '** Purpose:
  1272. '**     Updates any INI files that need it and does any other misc. updates.
  1273. '** Arguments:
  1274. '**     none.
  1275. '** Returns:
  1276. '**     none.
  1277. '*************************************************************************
  1278. SUB UpdateINI STATIC
  1279.     IF fGRAPH% = 1 OR fSPELL% = 1 THEN
  1280.         oldCursor% = ShowWaitCursor()
  1281.         sz$ = UIStartDlg(CUIDLL$, WAITINI, "FNoWaitDlgProc", 0, "")
  1282.  
  1283.         IF GetSymbolValue("STF_MODE") = "ADMIN" THEN
  1284.             IF LCASE$(MID$(MSDEST$, 1, 1)) = LCASE$(MID$(DEST$, 1, 1)) THEN
  1285.                 MSDEST$ = MID$(MSDEST$, 3, LEN(MSDEST$)-2)
  1286.             END IF
  1287.             CreateIniKeyValue MakePath(DEST$, DIRINI$), "TOOLS LOCATION", "DIR", MSDEST$, cmoOverwrite
  1288.         END IF
  1289.  
  1290.         IF fGRAPH% = 1 THEN
  1291.             CreateIniKeyValue "WIN.INI", "MSAPPS", "msapps", MSDEST$, cmoOverwrite
  1292.  
  1293.             CreateRegKeyValue "MSGraph", "Microsoft Graph"
  1294.             CreateRegKeyValue ".gra", "MSGraph"
  1295.             CreateRegKeyValue "MSGraph\protocol\StdFileEditing\server", MakePath(MSDEST$,"msgraph\graph.exe")
  1296.             CreateRegKeyValue "MSGraph\protocol\StdFileEditing\SetDataFormats", "Native,CF_TEXT"
  1297.             CreateRegKeyValue "MSGraph\protocol\StdFileEditing\RequestDataFormats", "Native,CF_METAFILEPICT"
  1298.             CreateRegKeyValue "MSGraph\protocol\StdExecute\server", MakePath(MSDEST$,"msgraph\graph.exe")
  1299.         END IF
  1300.  
  1301.         IF fSPELL% = 1 THEN
  1302.             CreateIniKeyValue "WIN.INI", "MS Proofing Tools", "Custom Dict 1", MakePath(MSDEST$,"proof\custom.dic"), cmoOverwrite
  1303.             CreateIniKeyValue "WIN.INI", "MS Proofing Tools", "Spelling 2057,0", MakePath(MSDEST$,"proof\msspell.dll")+","+MakePath(MSDEST$,"proof\mssp_br.lex"), cmoOverwrite
  1304.             CreateIniKeyValue "WIN.INI", "MS Proofing Tools", "Spelling 1033,0", MakePath(MSDEST$,"proof\msspell.dll")+","+MakePath(MSDEST$,"proof\mssp_am.lex"), cmoOverwrite
  1305.         END IF
  1306.  
  1307.         UIPop 1
  1308.         RestoreCursor oldCursor%
  1309.     END IF
  1310. END SUB
  1311.  
  1312. '**
  1313. '** Purpose:
  1314. '**     Update FILES in config.sys if needed.
  1315. '** Arguments:
  1316. '**     none.
  1317. '** Returns:
  1318. '**     none.
  1319. '*************************************************************************
  1320. SUB UpdateConfig STATIC
  1321.     IF CanFindConfigSys() <> 0 THEN
  1322.         IF GetConfigNumFiles() < MINFILES% THEN
  1323.             SetSymbolValue "RadioDefault", "1"
  1324.             UPDATETYPE:
  1325.                 sz$ = UIStartDlg(CUIDLL$, EDITMODE, "FRadioDlgProc", 0, "")
  1326.                 IF sz$ = "CONTINUE" THEN
  1327.                     UIPop 1
  1328.  
  1329.                     SetSymbolValue "MIN_FILES", "40"
  1330.  
  1331.                     IF GetSymbolValue("ButtonChecked") = "1" THEN
  1332.                         x% = QuietConfigUpdate()
  1333.                     ELSEIF GetSymbolValue("ButtonChecked") = "2" THEN
  1334.                         EDITCONFIGSTART:
  1335.                             sz$ = UIStartDlg(CUIDLL$, EDITCONFIG, "ConfigEditDlg", 0, "")
  1336.                             IF sz$ = "EXIT" or sz$ = "CANCEL" THEN
  1337.                                 ConfirmQuit
  1338.                                 GOTO EDITCONFIGSTART
  1339.                             ENDIF
  1340.                             UIPop 1
  1341.                     ELSE
  1342.                         GOTO CONFIGEND
  1343.                     ENDIF
  1344.  
  1345.                     IF GetSymbolValue("UPDATE_RESULT") = "ERROR" THEN
  1346.                         sz$ = UIStartDlg(CUIDLL$, CANTUPDATE, "FInfo0DlgProc", 0, "")
  1347.                     ELSE
  1348.                         sz$ = UIStartDlg(CUIDLL$, EDITOK, "FDlgFNameProc", 0, "")
  1349.                     END IF
  1350.                     UIPop 1
  1351.  
  1352.                 ELSE
  1353.                     ConfirmQuit
  1354.                     SetSymbolValue "RadioDefault", GetSymbolValue("ButtonChecked")
  1355.                     GOTO UPDATETYPE
  1356.                 END IF
  1357.         END IF
  1358.         CONFIGEND:
  1359.     ELSE
  1360.         SetSymbolValue "ConfirmTextIn", ""
  1361.         AddListItem "ConfirmTextIn", STR$(MINFILES%)
  1362.         AddListItem "ConfirmTextIn", STR$(MINFILES%)
  1363.         sz$ = UIStartDlg(CUIDLL$, CANTFIND, "FSprintfDlgProc", 0, "")
  1364.         UIPop 1
  1365.     END IF
  1366. END SUB
  1367.  
  1368. '**
  1369. '** Purpose:
  1370. '**     Confirms that the user really wants to quit when they select a quit
  1371. '**             option.
  1372. '** Arguments:
  1373. '**     none.
  1374. '** Returns:
  1375. '**     none.
  1376. '*************************************************************************
  1377. SUB ConfirmQuit STATIC
  1378.     CONFIRMQUITSTART:
  1379.     sz$ = UIStartDlg(CUIDLL$, ASKQUIT, "FQuitDlgProc", 0, "")
  1380.  
  1381.     IF sz$ = "EXIT" or sz$ = "CANCEL" THEN
  1382.         UIPopAll
  1383.         ERROR STFQUIT
  1384.         ELSEIF sz$ = "REACTIVATE" THEN
  1385.         GOTO CONFIRMQUITSTART
  1386.         ELSE
  1387.         UIPop 1
  1388.         END IF
  1389. END SUB
  1390.  
  1391. '**
  1392. '** Purpose:
  1393. '**     Warns the user that they must enter a name.
  1394. '** Arguments:
  1395. '**     none.
  1396. '** Returns:
  1397. '**     none.
  1398. '*************************************************************************
  1399. SUB WarnBadName STATIC
  1400.     WARNBADNAMESTART:
  1401.         sz$ = UIStartDlg(CUIDLL$, BADNAME, "FInfo0DlgProc", 0, "")
  1402.         IF sz$ = "REACTIVATE" THEN
  1403.         GOTO WARNBADNAMESTART
  1404.         END IF
  1405.         UIPop 1
  1406. END SUB
  1407.  
  1408. '**
  1409. '** Purpose:
  1410. '**     Warns the user that they have specified an invalid path.
  1411. '** Arguments:
  1412. '**     none.
  1413. '** Returns:
  1414. '**     none.
  1415. '*************************************************************************
  1416. FUNCTION WarnBadPath (dlg%) STATIC AS STRING
  1417.     WARNBADPATHSTART:
  1418.     sz$ = UIStartDlg(CUIDLL$, dlg%, "FInfo0DlgProc", 0, "")
  1419.     IF sz$ = "REACTIVATE" THEN
  1420.         GOTO WARNBADPATHSTART
  1421.         END IF
  1422.         UIPop 1
  1423.  
  1424.     WarnBadPath = sz$
  1425. END FUNCTION
  1426.  
  1427. '**
  1428. '** Purpose:
  1429. '**     Appends a file name to the end of a directory path,
  1430. '**     inserting a backslash character as needed.
  1431. '** Arguments:
  1432. '**     szDir$  - full directory path (with optional ending "\")
  1433. '**     szFile$ - filename to append to directory
  1434. '** Returns:
  1435. '**     Resulting fully qualified path name.
  1436. '*************************************************************************
  1437. FUNCTION MakePath (szDir$, szFile$) STATIC AS STRING
  1438.     IF szDir$ = "" THEN
  1439.     MakePath = szFile$
  1440.     ELSEIF szFile$ = "" THEN
  1441.     MakePath = szDir$
  1442.     ELSEIF MID$(szDir$, LEN(szDir$), 1) = "\" THEN
  1443.     MakePath = szDir$ + szFile$
  1444.     ELSE
  1445.     MakePath = szDir$ + "\" + szFile$
  1446.     END IF
  1447. END FUNCTION
  1448.  
  1449. '**
  1450. '** Purpose:
  1451. '**     Records the section sizes.
  1452. '** Arguments:
  1453. '**     none.
  1454. '** Returns:
  1455. '**     none.
  1456. '*************************************************************************
  1457. SUB SetSectionSize STATIC
  1458.     ReplaceListItem "CheckItemsSize", REQFILES, SectionSize("reqfiles")
  1459.     ReplaceListItem "WinDriveSize", REQFILES, "0"
  1460.  
  1461.     ReplaceListItem "CheckItemsSize", WINHELP, SectionSize("winhelp")
  1462.     ReplaceListItem "WinDriveSize", WINHELP, "0"
  1463.  
  1464.     ReplaceListItem "CheckItemsSize", FPHELP, SectionSize("fphelp")
  1465.     ReplaceListItem "WinDriveSize", FPHELP, "0"
  1466.  
  1467.     ReplaceListItem "CheckItemsSize", TUTORIAL, SectionSize("tutorial")
  1468.     ReplaceListItem "WinDriveSize", TUTORIAL, "0"
  1469.  
  1470.     ReplaceListItem "CheckItemsSize", FOXAPP, SectionSize("foxapp")
  1471.     ReplaceListItem "WinDriveSize", FOXAPP, "0"
  1472.  
  1473.     ReplaceListItem "CheckItemsSize", EXAMPLES, SectionSize("examples")
  1474.     ReplaceListItem "WinDriveSize", EXAMPLES, "0"
  1475.  
  1476.     ReplaceListItem "CheckItemsSize", FOXDOC, SectionSize("foxdoc")
  1477.     ReplaceListItem "WinDriveSize", FOXDOC, "0"
  1478.  
  1479.     ReplaceListItem "CheckItemsSize", MSGRAPH, SectionSize("msgraph")
  1480.     ReplaceListItem "WinDriveSize", MSGRAPH, SectionSize("graphwiz")
  1481.  
  1482.     ReplaceListItem "CheckItemsSize", SPELL, SectionSize("spellapp")
  1483.     ReplaceListItem "WinDriveSize", SPELL, SectionSize("spell")
  1484.  
  1485.     ''
  1486.     ''  The following items are not options given to the user.
  1487.     ''
  1488.     ReplaceListItem "CheckItemsSize", SYSFILES, "0"
  1489.     ReplaceListItem "WinDriveSize", SYSFILES, SectionSize("sysfiles")
  1490.  
  1491.     ReplaceListItem "CheckItemsSize", WINFILES, "0"
  1492.     ReplaceListItem "WinDriveSize", WINFILES, SectionSize("winfiles")
  1493.  
  1494.     ReplaceListItem "CheckItemsSize", SETUP, SectionSize("setup")
  1495.     ReplaceListItem "WinDriveSize", SETUP, "0"
  1496. END SUB
  1497.  
  1498. '**
  1499. '** Purpose:
  1500. '**     Determines how much space a given section will occupy.
  1501. '** Arguments:
  1502. '**     szSection$ - The section to determine the size of.
  1503. '** Returns:
  1504. '**     The size in K bytes of the section.
  1505. '*************************************************************************
  1506. FUNCTION SectionSize (szSection$) STATIC AS STRING
  1507.     MakeListFromSectionSize "SizeList", szSection$
  1508.     SectionSize = STR$(CalcListSize())
  1509.     RemoveSymbol "SizeList"
  1510. END FUNCTION
  1511.