Reorganisation of the source tree
[ghc-hetmet.git] / InstallShield / Script Files / setup.rul
diff --git a/InstallShield/Script Files/setup.rul b/InstallShield/Script Files/setup.rul
new file mode 100644 (file)
index 0000000..28fc24a
--- /dev/null
@@ -0,0 +1,950 @@
+////////////////////////////////////////////////////////////////////////////////
+//
+//  IIIIIII SSSSSS
+//    II    SS                          InstallShield (R)
+//    II    SSSSSS      (c) 1996-1997, InstallShield Software Corporation
+//    II        SS      (c) 1990-1996, InstallShield Corporation
+//  IIIIIII SSSSSS                     All Rights Reserved.
+//
+//
+//  This code is generated as a starting setup template.  You should
+//  modify it to provide all necessary steps for your setup.
+//
+//
+//    File Name:  Setup.rul
+//
+//  Description:  InstallShield script
+//
+//     Comments:  This template script performs a basic setup on a
+//                Windows 95 or Windows NT 4.0 platform. With minor
+//                modifications, this template can be adapted to create
+//                new, customized setups.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+
+  // Include header file
+#include "ifx.h"
+
+////////////////////// string defines ////////////////////////////
+
+#define UNINST_LOGFILE_NAME      "Uninst.isu"
+
+//////////////////// installation declarations ///////////////////
+
+  // ----- DLL prototypes -----
+
+
+     // your DLL prototypes
+
+
+  // ---- script prototypes -----
+
+     // generated
+     prototype ShowDialogs();
+     prototype MoveFileData();
+     prototype HandleMoveDataError( NUMBER );
+     prototype ProcessBeforeDataMove();
+     prototype ProcessAfterDataMove();
+     prototype SetupRegistry();
+     prototype SetupFolders();
+     prototype CleanUpInstall();
+     prototype SetupInstall();
+     prototype SetupScreen();
+     prototype CheckListScreen();
+     prototype CheckRequirements();
+     prototype DialogShowSdWelcome();
+     prototype DialogShowSdShowInfoList();
+     prototype DialogShowSdAskDestPath();
+     prototype DialogShowSdSetupType();
+     prototype DialogShowSdComponentDialog2();
+     prototype DialogShowSdSelectFolder();
+     prototype DialogShowSdFinishReboot();
+
+     // your prototypes
+     prototype MyParsePath ( STRING );
+     prototype ForwardSlashify ( STRING, BYREF STRING );
+     prototype CreateExecPerlScript ( STRING, STRING );
+     prototype DropSuffix ( STRING, BYREF STRING );
+     prototype BaseName   ( STRING, BYREF STRING );
+
+  // ----- global variables ------
+
+     // generated
+     BOOL        bWinNT, bIsShellExplorer, bInstallAborted, bIs32BitSetup;
+     STRING      svDir;
+     STRING      svName, svCompany, svSerial;
+     STRING      szAppPath;
+     STRING      svSetupType;
+     LIST        listPath;
+
+
+     // your global variables
+     //STRING      szRawCpp
+     STRING      szPerlPath;
+     STRING      szBinDir, szBinDirUnslashed,
+                 szLibDir, szLibDirUnslashed,
+                 szDataDir, szLibExecDir;
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+//   MAIN PROGRAM
+//
+//      The setup begins here by hiding the visible setup
+//      window.  This is done to allow all the titles, images, etc. to
+//      be established before showing the main window.  The following
+//      logic then performs the setup in a series of steps.
+//
+///////////////////////////////////////////////////////////////////////////////
+program
+    Disable( BACKGROUND );
+
+    CheckRequirements();
+
+    SetupInstall();
+
+    SetupScreen();
+
+    if (ShowDialogs()<0) goto end_install;
+
+    if (ProcessBeforeDataMove()<0) goto end_install;
+
+    if (MoveFileData()<0) goto end_install;
+
+    if (ProcessAfterDataMove()<0) goto end_install;
+
+    if (SetupRegistry()<0) goto end_install;
+
+    if (SetupFolders()<0) goto end_install;
+
+    CheckListScreen();
+    
+  end_install:
+
+    CleanUpInstall();
+
+     // If an unrecoverable error occurred, clean up the partial installation.
+     // Otherwise, exit normally.
+
+    if (bInstallAborted) then
+        abort;
+    endif;
+
+endprogram
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function:  ShowDialogs                                                    //
+//                                                                           //
+//  Purpose:  This function manages the display and navigation               //
+//            the standard dialogs that exist in a setup.                    //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function ShowDialogs()
+    NUMBER  nResult;
+ begin
+
+    Dlg_Start:
+        // beginning of dialogs label
+
+    Dlg_SdWelcome:
+        nResult = DialogShowSdWelcome();
+        if (nResult = BACK) goto Dlg_Start;
+
+    Dlg_SdShowInfoList:
+        nResult = DialogShowSdShowInfoList();
+        if (nResult = BACK) goto Dlg_SdWelcome;
+
+    Dlg_SdAskDestPath:
+        nResult = DialogShowSdAskDestPath();
+        if (nResult = BACK) goto Dlg_SdShowInfoList;
+
+    Dlg_SdSetupType:
+        nResult = DialogShowSdSetupType();
+        if (nResult = BACK) goto Dlg_SdAskDestPath;
+
+    Dlg_SdComponentDialog2:
+        if ((nResult = BACK) && (svSetupType != "Custom") && (svSetupType != "")) then
+           goto Dlg_SdSetupType;
+        endif;
+        nResult = DialogShowSdComponentDialog2();
+        if (nResult = BACK) goto Dlg_SdSetupType;
+
+    Dlg_SdSelectFolder:
+        //nResult = DialogShowSdSelectFolder();
+        //if (nResult = BACK) goto Dlg_SdComponentDialog2;
+
+    return 0;
+
+ end;
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function: ProcessBeforeDataMove                                           //
+//                                                                           //
+//  Purpose: This function performs any necessary operations prior to the    //
+//           actual data move operation.                                     //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function ProcessBeforeDataMove()
+    STRING svLogFile;
+    NUMBER nResult;
+ begin
+
+  InstallationInfo( @COMPANY_NAME, @PRODUCT_NAME, @PRODUCT_VERSION, @PRODUCT_KEY );
+
+  svLogFile = UNINST_LOGFILE_NAME;
+
+  nResult = DeinstallStart( svDir, svLogFile, @UNINST_KEY, 0 );
+  if (nResult < 0) then
+      MessageBox( @ERROR_UNINSTSETUP, WARNING );
+  endif;
+
+  szAppPath = TARGETDIR; // TODO : if your application .exe is in a subdir of TARGETDIR then add subdir
+
+  if ((bIs32BitSetup) && (bIsShellExplorer)) then
+      RegDBSetItem( REGDB_APPPATH, szAppPath );
+      RegDBSetItem( REGDB_APPPATH_DEFAULT, szAppPath ^ @PRODUCT_KEY );
+      RegDBSetItem( REGDB_UNINSTALL_NAME, @UNINST_DISPLAY_NAME );
+  endif;
+  // TODO : update any items you want to process before moving the data
+  //
+
+  ComponentSetTarget( MEDIA, "<DOCDIR>", TARGETDIR ^ "\\doc" );
+
+  return 0;
+ end;
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function:  MoveFileData                                                   //
+//                                                                           //
+//  Purpose:  This function handles the data movement for                    //
+//            the setup.                                                     //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function MoveFileData()
+    NUMBER nResult, nDisk;
+ begin
+
+  nDisk = 1;
+  SetStatusWindow( 0, "" );
+  Disable( DIALOGCACHE );
+  Enable( STATUS );
+  StatusUpdate( ON, 100 );
+  nResult = ComponentMoveData( MEDIA, nDisk, 0 );
+
+  HandleMoveDataError( nResult );
+
+  Disable( STATUS );
+
+  return nResult;
+
+ end;
+
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function: HandleMoveDataError                                             //
+//                                                                           //
+//  Purpose: This function handles the error (if any) during the move data   //
+//           operation.                                                      //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function HandleMoveDataError( nResult )
+    STRING szErrMsg, svComponent , svFileGroup , svFile;
+ begin
+
+  svComponent = "";
+  svFileGroup = "";
+  svFile = "";
+
+  switch (nResult)
+  case 0:
+       return 0;
+  default:
+       ComponentError ( MEDIA , svComponent , svFileGroup , svFile , nResult );
+       szErrMsg = @ERROR_MOVEDATA  + "\n\n" +
+                  @ERROR_COMPONENT + " " + svComponent + "\n" +
+                  @ERROR_FILEGROUP + " " + svFileGroup + "\n" +
+                  @ERROR_FILE      + " " + svFile;
+       SprintfBox( SEVERE, @TITLE_CAPTIONBAR, szErrMsg, nResult );
+       bInstallAborted = TRUE;
+       return nResult;
+  endswitch;
+
+ end;
+
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function: ProcessAfterDataMove                                            //
+//                                                                           //
+//  Purpose: This function performs any necessary operations needed after    //
+//           all data has been moved.                                        //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function ProcessAfterDataMove()
+  STRING szPath, szGcc, szGccDir;
+  STRING szTemp, szRes, szPathEntry, szDrive;
+  NUMBER nvSize,nvType, nResult, nPos, nSuccess;
+  LIST   listDirs;
+ begin
+
+  RegDBSetDefaultRoot ( HKEY_LOCAL_MACHINE );
+  RegDBGetKeyValueEx ( "SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Environment" ,
+                       "path" , nvType, szPath , nvSize );
+
+  // Spin through path looking for perl.exe.
+  // Our task is made considerably harder since the
+  // the free version of InstallShield doesn't support
+  // functions such as StrGetTokens() or ParsePath().
+  // TODO: Convert this back to IS Prof Edn
+
+  MyParsePath ( szPath );
+  nResult = ListGetFirstString ( listPath, szPathEntry);
+  szPathEntry = ""; szPerlPath="";
+  while ( nResult != END_OF_LIST )
+     if ( FindFile (szPathEntry, "perl.exe", szRes ) = 0 ) then
+       szPerlPath = szPathEntry + "/" + szRes;
+       nResult = END_OF_LIST;
+     else
+       nResult = ListGetNextString ( listPath, szPathEntry );
+     endif;
+  endwhile;
+  if ( StrCompare ( szPerlPath, "" ) = 0 ) then
+    // If not found in global env. block, look in the
+    // user-specific part.
+    RegDBSetDefaultRoot ( HKEY_CURRENT_USER );
+    RegDBGetKeyValueEx ( "Environment", "path", nvType, szPath, nvSize);
+    MyParsePath ( szPath );
+    nResult = ListGetFirstString ( listPath, szPathEntry);
+    szPathEntry = ""; szPerlPath="";
+    while ( nResult != END_OF_LIST )
+      if ( FindFile (szPathEntry, "perl.exe", szRes ) = 0 ) then
+        szPerlPath = szPathEntry + "/" + szRes;
+        nResult = END_OF_LIST;
+      else
+        nResult = ListGetNextString ( listPath, szPathEntry );
+      endif;
+    endwhile;
+  endif;
+
+  if ( StrCompare ( szPerlPath, "" ) = 0 ) then
+     // Default it to /bin/perl
+     MessageBox ("Unable to find perl in your PATH. Not to worry, this installer includes a version that should be useable." +
+                 "When the installer has finished, please copy it from the bin/ directory of the ghc installation to /bin/perl",
+                 INFORMATION);
+     szPerlPath = "/bin/perl.exe";
+  else
+     // strip initial drive spec.
+     GetDir ( szPerlPath, szTemp);
+     ForwardSlashify ( szTemp, szPerlPath );
+  endif;
+  DropSuffix (szPerlPath, szTemp);
+  szPerlPath = szTemp;
+
+  ListDestroy (listPath);
+
+  return 0;
+ end;
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function: SetupRegistry                                                   //
+//                                                                           //
+//  Purpose: This function makes the registry entries for this setup.        //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function SetupRegistry()
+ NUMBER nResult,nWays,i;
+ STRING szProjectDir, szProjectVersionDir, szTargetDir;
+ STRING szSyslib, szWay, szSyslibsDir;
+ STRING szLib, szSyslibsKey;
+ //LIST   syslib_list, way_list;
+ begin
+
+  // TODO : Add all your registry entry keys here
+  //
+  //
+
+  nResult = CreateRegistrySet( "" );
+
+  // By now, we will have had the following Registry
+  // entries generated (see ProcessBeforeDataMove() ):
+  //
+  // HK_L_M\Software\Glasgow University\GHC\<version no.>
+  //
+  // For GHC, we store and use the install info inside
+  //  HK_L_M\Software\Haskell\GHC (== %ROOT%)
+
+  // So, we perform the following tasks here:
+  //
+  //  * Checks to see if %ROOT% is defined.
+  //    If not, creates it.
+  //  * Checks for %ROOT%\Version is defined.
+  //  * Create %ROOT%\<version>.
+  //  * Create %ROOT%\<version>\libdir
+  //    (This key will be given a value later.)
+  //  * Create %ROOT%\syslib\  and fill it in
+  //    with the syslibs that has been installed.
+  //  * %ROOT%\syslib\name\<way>
+  //    is added for each kind (e.g., seq, conc)
+  //    syslib we're installing.
+
+  // When we eventually reach the end, the registry
+  // should be ready for use by the installed app.
+
+  // Check to see if we've already installed
+  // a version of GHC on this box..
+  RegDBSetDefaultRoot ( HKEY_LOCAL_MACHINE );
+
+  szProjectDir = @HASKELL_REG_ROOT ^ @PRODUCT_NAME;
+
+  // check whether we've already got the Registry sub-tree we're
+  // about to add to. If not, then we create it
+  // level-by-level, so as to ensure that the uninstaller
+  // can clean up after us.
+  if ( RegDBKeyExist ( @HASKELL_REG_ROOT ) < 0) then
+     RegDBCreateKeyEx (@HASKELL_REG_ROOT, "");
+  endif;
+  if ( RegDBKeyExist  ( szProjectDir ) < 0 ) then
+     RegDBCreateKeyEx ( szProjectDir, "");
+  endif;
+
+  // Note: we overwrite any existing value.
+  RegDBSetKeyValueEx( szProjectDir, "Version", REGDB_STRING,
+                       @PRODUCT_KEY, -1);
+
+  szProjectVersionDir = szProjectDir ^ @PRODUCT_KEY;
+
+  if ( RegDBKeyExist ( szProjectVersionDir ) < 0) then
+     RegDBCreateKeyEx ( szProjectVersionDir, "");
+  endif;
+
+  // Here starts the GHC specific part
+
+  ForwardSlashify (TARGETDIR, szTargetDir);
+  // fill in the all-important path to where the archives
+  // and interface files have been parked.
+  szLibDir = szTargetDir + "/lib";
+  szLibDirUnslashed = TARGETDIR ^ "\\lib";
+  RegDBSetKeyValueEx ( szProjectVersionDir, "libdir", REGDB_STRING,
+                       szLibDir , -1);
+  // libexecdir
+  szLibExecDir = szTargetDir + "/lib";
+  RegDBSetKeyValueEx ( szProjectVersionDir, "libexecdir", REGDB_STRING,
+                       szLibExecDir , -1);
+  // bindir
+  szBinDir = szTargetDir + "/bin";
+  szBinDirUnslashed = TARGETDIR ^ "\\bin";
+  RegDBSetKeyValueEx ( szProjectVersionDir, "bindir", REGDB_STRING,
+                       szBinDir , -1);
+  
+  return 0;
+ end;
+
+
+///////////////////////////////////////////////////////////////////////////////
+//
+// Function: SetupFolders
+//
+//  Purpose: This function creates all the folders and shortcuts for the
+//           setup.  This includes program groups and items for Windows 3.1.
+//
+///////////////////////////////////////////////////////////////////////////////
+function SetupFolders()
+ NUMBER nResult;
+ begin
+
+
+  // TODO : Add all your folder (program group) along with shortcuts (program items)
+  //
+  //
+  //    CreateProgramFolder, AddFolderIcon....
+  //
+
+  CreateExecPerlScript ( szBinDirUnslashed, "ghc-" + @PRODUCT_VERSION );
+  CreateExecPerlScript ( szBinDirUnslashed, "stat2resid" );
+  CreateExecPerlScript ( szLibDirUnslashed, "hscpp" );
+  CreateExecPerlScript ( szLibDirUnslashed, "mkdependHS" );
+
+  VarSave (SRCTARGETDIR);
+  SRCDIR = szBinDirUnslashed;
+  TARGETDIR = szBinDirUnslashed;
+  CopyFile( "ghc-" + @PRODUCT_VERSION, "ghc");
+  VarRestore (SRCTARGETDIR);
+
+  nResult = CreateShellObjects( "" );
+
+  return nResult;
+ end;
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function: CleanUpInstall                                                  //
+//                                                                           //
+//  Purpose: This cleans up the setup.  Anything that should                 //
+//           be released or deleted at the end of the setup should           //
+//           be done here.                                                   //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function CleanUpInstall()
+ begin
+
+
+  if (bInstallAborted) then
+      return 0;
+  endif;
+
+  DialogShowSdFinishReboot();
+
+  if (BATCH_INSTALL) then // ensure locked files are properly written
+      CommitSharedFiles(0);
+  endif;
+
+  return 0;
+ end;
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function: SetupInstall                                                    //
+//                                                                           //
+//  Purpose: This will setup the installation.  Any general initialization   //
+//           needed for the installation should be performed here.           //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function SetupInstall()
+
+ begin
+
+  Enable( CORECOMPONENTHANDLING );
+
+  bInstallAborted = FALSE;
+
+  GetDisk(WINDIR, svDir);
+
+  if (bIs32BitSetup) then
+      svDir = svDir + "\\" ^ @PRODUCT_NAME_SHORT ^ @PRODUCT_KEY;
+  else
+      // We're (=>ghc) 32 through and through, but for the sake of
+      // completenes.
+      svDir = svDir + "\\" ^ @PRODUCT_NAME_SHORT ^ @PRODUCT_NAME16;
+  endif;
+
+  TARGETDIR  = svDir;
+
+  SdProductName( @PRODUCT_NAME );
+
+  Enable( DIALOGCACHE );
+
+  return 0;
+ end;
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function:  SetupScreen                                                    //
+//                                                                           //
+//  Purpose:  This function establishes  the screen look.  This includes     //
+//            colors, fonts, and text to be displayed.                       //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function SetupScreen()
+ begin
+
+  SetColor ( BACKGROUND, BLUE );
+  Enable( FULLWINDOWMODE );
+  Enable( INDVFILESTATUS );
+
+  SetTitle( @TITLE_MAIN, 24, WHITE );
+
+  SetTitle( @TITLE_CAPTIONBAR, 0, BACKGROUNDCAPTION ); // Caption bar text.
+
+  Enable( BACKGROUND );
+
+  Delay( 1 );
+ end;
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function:  CheckRequirements                                              //
+//                                                                           //
+//  Purpose:  This function checks all minimum requirements for the          //
+//            application being installed.  If any fail, then the user       //
+//            is informed and the setup is terminated.                       //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function CheckRequirements()
+    NUMBER  nvDx, nvDy, nvResult;
+    STRING  svResult;
+
+ begin
+
+  bWinNT           = FALSE;
+  bIsShellExplorer = FALSE;
+
+  // Check screen resolution.
+  GetExtents( nvDx, nvDy );
+
+  if (nvDy < 480) then
+      MessageBox( @ERROR_VGARESOLUTION, WARNING );
+      abort;
+  endif;
+
+  // set 'setup' operation mode
+  bIs32BitSetup = TRUE;
+  GetSystemInfo( ISTYPE, nvResult, svResult );
+  if (nvResult = 16) then
+      bIs32BitSetup = FALSE; // running 16-bit setup
+      return 0; // no additional information required
+  endif;
+
+  // --- 32-bit testing after this point ---
+
+  // Determine the target system's operating system.
+  GetSystemInfo( OS, nvResult, svResult );
+
+  if (nvResult =  IS_WINDOWSNT) then
+      // Running Windows NT.
+      bWinNT = TRUE;
+
+      // Check to see if the shell being used is EXPLORER shell.
+      if (GetSystemInfo( OSMAJOR, nvResult, svResult ) = 0) then
+          if (nvResult >= 4) then
+              bIsShellExplorer = TRUE;
+          endif;
+      endif;
+
+  elseif (nvResult = IS_WINDOWS95 ) then
+      bIsShellExplorer = TRUE;
+
+  endif;
+
+end;
+
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function: DialogShowSdWelcome                                             //
+//                                                                           //
+//  Purpose: This function handles the standard welcome dialog.              //
+//                                                                           //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function DialogShowSdWelcome()
+    NUMBER nResult;
+    STRING szTitle, szMsg;
+ begin
+
+  szTitle = "";
+  szMsg   = "";
+  nResult = SdWelcome( szTitle, szMsg );
+
+  return nResult;
+ end;
+                         
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function: DialogShowSdShowInfoList                                        //
+//                                                                           //
+//  Purpose: This function displays the general information list dialog.     //
+//                                                                           //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function DialogShowSdShowInfoList()
+    NUMBER nResult;
+    LIST   list;
+    STRING szTitle, szMsg, szFile;
+ begin
+
+  szFile = SUPPORTDIR ^ "announce";
+
+  list = ListCreate( STRINGLIST );
+  ListReadFromFile( list, szFile );
+  szTitle  = "";
+  szMsg    = " ";
+  nResult  = SdShowInfoList( szTitle, szMsg, list );
+
+  ListDestroy( list );
+
+  return nResult;
+ end;
+
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function: DialogShowSdAskDestPath                                         //
+//                                                                           //
+//  Purpose: This function asks the user for the destination directory.      //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function DialogShowSdAskDestPath()
+    NUMBER nResult;
+    STRING szTitle, szMsg;
+ begin
+
+  szTitle = "";
+  szMsg   = "WARNING! The path must not contain spaces.";
+  nResult = SdAskDestPath( szTitle, szMsg, svDir, 0 );
+
+  TARGETDIR = svDir;
+
+  return nResult;
+ end;
+
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function: DialogShowSdSetupType                                           //
+//                                                                           //
+//  Purpose: This function displays the standard setup type dialog.          //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function DialogShowSdSetupType()
+    NUMBER nResult, nType;
+    STRING szTitle, szMsg;
+ begin
+
+  switch (svSetupType)
+  case "Typical":
+       nType = TYPICAL;
+  case "Custom":
+       nType = CUSTOM;
+  case "Compact":
+       nType = COMPACT;
+  case "":
+       svSetupType = "Typical";
+       nType = TYPICAL;
+  endswitch;
+
+  szTitle = "";
+  szMsg   = "";
+  nResult = SetupType( szTitle, szMsg, "", nType, 0 );
+
+  switch (nResult)
+  case COMPACT:
+       svSetupType = "Compact";
+  case TYPICAL:
+       svSetupType = "Typical";
+  case CUSTOM:
+       svSetupType = "Custom";
+  endswitch;
+
+  return nResult;
+ end;
+
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function: DialogShowSdComponentDialog2                                    //
+//                                                                           //
+//  Purpose: This function displays the custom component dialog.             //
+//                                                                           //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function DialogShowSdComponentDialog2()
+    NUMBER nResult;
+    STRING szTitle, szMsg;
+ begin
+
+  if ((svSetupType != "Custom") && (svSetupType != "")) then
+      return 0;
+  endif;
+
+  szTitle  = "";
+  szMsg    = "";
+  nResult  = SdComponentDialog2( szTitle, szMsg, svDir, "" );
+
+  return nResult;
+ end;
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function: CheckListScreen                                                 //
+//                                                                           //
+//  Purpose: Show a check-list of post-install user actions.                 //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function CheckListScreen()   
+       BOOL bDone;
+       NUMBER nCmdValue;
+ begin   
+       EzDefineDialog("CHECKLIST", "", "", 30001);
+
+    bDone = FALSE;   
+    while (bDone=FALSE)   
+       nCmdValue = WaitOnDialog("CHECKLIST");   
+          switch (nCmdValue)      
+              case DLG_INIT:               
+              // Process the Next button.         
+              case SD_PBUT_CONTINUE:         
+                  bDone = TRUE;           
+              // Process the Cancel button.         
+              case SD_PBUT_EXITSETUP:
+                  bDone = TRUE;            
+              // Process the close dialog box button.
+              case DLG_CLOSE:         
+                  bDone = TRUE;         
+              // Process dialog box errors.            
+              case DLG_ERR:
+                  MessageBox("Internal dialog box error", SEVERE);         
+                  bDone = TRUE;         
+          endswitch;            
+    endwhile;           
+    // Identify the end of dialog box processing.  
+    EndDialog("CHECKLIST");   
+    // Free the dialog box and list from memory.
+    ReleaseDialog("CHECKLIST");   
+ end;                    
+
+///////////////////////////////////////////////////////////////////////////////
+//                                                                           //
+// Function: DialogShowSdFinishReboot                                        //
+//                                                                           //
+//  Purpose: This function will show the last dialog of the product.         //
+//           It will allow the user to reboot and/or show some readme text.  //
+//                                                                           //
+///////////////////////////////////////////////////////////////////////////////
+function DialogShowSdFinishReboot()
+    NUMBER nResult, nDefOptions;
+    STRING szTitle, szMsg1, szMsg2, szOption1, szOption2;
+    NUMBER bOpt1, bOpt2;
+ begin
+
+  if (!BATCH_INSTALL) then
+      bOpt1 = FALSE;
+      bOpt2 = FALSE;
+      szMsg1 = "";
+      szMsg2 = "";
+      szOption1 = "";
+      szOption2 = "";
+      szTitle = "Installation is now complete.";
+      nResult = SdFinish( szTitle, szMsg1, szMsg2, szOption1, szOption2, bOpt1, bOpt2 );
+      return 0;
+  else
+      nDefOptions = SYS_BOOTMACHINE;
+      szTitle     = "";
+      szMsg1      = "";
+      szMsg2      = "";
+      nResult     = SdFinishReboot( szTitle, szMsg1, nDefOptions, szMsg2, 0 );
+      return nResult;
+  endif;
+ end;
+
+function MyParsePath(szPath)
+  STRING szTmp,szPth;
+  NUMBER nPos;
+ begin
+   szPth = szPath;
+   listPath = ListCreate( STRINGLIST );
+
+   // Man, all I want is map. Please? :-)
+   nPos = StrFind ( szPth, ";");
+   while ( nPos > 0 )
+    StrSub ( szTmp, szPth, 0, nPos);
+    ListAddString ( listPath, szTmp, AFTER );
+    StrSub ( szTmp, szPth, nPos + 1, StrLength ( szPth) - nPos );
+    szPth = szTmp;
+    nPos = StrFind ( szPth, ";" );
+   endwhile;
+
+  return 0;
+ end;
+
+ function ForwardSlashify ( szStr , theRes )
+   NUMBER nPos;
+   STRING szTemp, szRes;
+ begin
+  // Tortuous piece of code to convert backslashes into
+  // forward ones.
+  nPos = StrFind ( szStr, "\\");
+  szRes="";
+  while ( nPos >= 0 )
+    StrSub ( szTemp, szStr, 0, nPos);
+    szRes = szRes + szTemp + "/";
+    StrSub ( szTemp, szStr, nPos + 1, StrLength ( szStr) - nPos );
+    szStr = szTemp;
+    nPos = StrFind ( szStr, "\\" );
+  endwhile;
+  StrSub ( szTemp, szStr, 0, StrLength (szStr));
+  szRes = szRes + szTemp;
+  theRes = szRes;
+  return 0;
+ end;
+
+ function CreateExecPerlScript ( szPath, szFileName )
+    NUMBER nResult, writeHandle, readHandle;
+    STRING szLine;
+ begin
+   VarSave (SRCTARGETDIR);
+   SRCDIR = szPath;
+   TARGETDIR = szPath;
+   DeleteFile ( szFileName + ".bak");
+   RenameFile ( szFileName, szFileName + ".bak");
+   VarRestore (SRCTARGETDIR);
+
+   OpenFileMode (FILE_MODE_APPEND);
+   if ( CreateFile ( writeHandle, szPath, szFileName ) < 0 ) then
+      MessageBox ("CreateFile " + szPath ^ szFileName + " failed", INFORMATION);
+   endif;
+   // append
+   WriteLine (writeHandle, "#!" + szPerlPath );
+   WriteLine (writeHandle, "$libdir='" + szLibDir + "';");
+   WriteLine (writeHandle, "$bindir='" + szBinDir + "';");
+   WriteLine (writeHandle, "$libexecdir='" + szLibExecDir + "';");
+   WriteLine (writeHandle, "$datadir='" + szDataDir + "';");
+   WriteLine (writeHandle, "$SED='sed';");
+   WriteLine (writeHandle, "$TMPDIR='C:/TEMP';");
+   WriteLine (writeHandle, "$RAWCPP='gcc -E';");
+   // For the benefit of mkdependHS, which doesn't get this prepended
+   WriteLine (writeHandle, "$INSTALLING=1;");
+
+   OpenFileMode (FILE_MODE_NORMAL);
+   if ( OpenFile ( readHandle, szPath, szFileName + ".bak") < 0 ) then
+      MessageBox ("OpenFile " + szPath ^ szFileName + ".bak failed", INFORMATION);
+   endif;
+
+   // copy the template over.
+   nResult = GetLine ( readHandle, szLine);
+   while ( nResult >= 0 )
+     WriteLine ( writeHandle, szLine);
+     nResult = GetLine ( readHandle, szLine);
+   endwhile;
+   if ( CloseFile( readHandle ) < 0 ) then
+       MessageBox ( "CloseFile " + szPath ^ szFileName + ".bak failed",
+                    INFORMATION);
+   endif;
+   if ( CloseFile( writeHandle ) < 0 ) then
+       MessageBox ( "CloseFile " + szPath ^ szFileName + " failed",
+                    INFORMATION);
+   endif;
+   // There's no way to set the 'x' bit using
+   // SetFileInfo(), but luckily it is not needed to run #! scripts
+   // under cygwin.
+   SetFileInfo ( szPath ^ szFileName, FILE_ATTRIBUTE, FILE_ATTR_NORMAL, "");     
+   // Delete the .bak file
+   DeleteFile ( szPath ^ szFileName + ".bak");
+   
+   return 0;
+ end;
+
+ function DropSuffix ( szInp, szOut )
+   NUMBER nResult, nLen;
+   STRING szTemp, szTemp2;
+ begin
+    nLen = 0;
+    szTemp2 = szInp;
+    nResult = StrFind ( szTemp2 , ".");
+    while ( nResult >= 0 )
+       nLen = nLen + nResult;
+       StrSub ( szTemp, szTemp2, nResult + 1, StrLength ( szTemp2) - nResult );
+       szTemp2 = szTemp;
+       nResult = StrFind ( szTemp2, "." );
+       if ( nResult >= 0 ) then
+          nLen = nLen + 1;  // incl the previous . if there's more.
+       endif;
+    endwhile;
+    StrSub ( szOut, szInp, 0, nLen);
+    return 0;
+ end;
\ No newline at end of file