/*** Start of Part 4 of the source code of TEMPLATE.CMD ***/ /*!*/ /* ------------------------------------------------------------------ */ /* function: main procedure of the program */ /* */ /* call: called by the runtime system with: */ /* => call main parameter_of_the_program */ /* */ /* returns: program return code */ /* If no return code is returned, the value of the variable */ /* prog.__ExitCode is returned to the calling program. */ /* */ Main: PROCEDURE expose (exposeList) /* ------------------------------ */ /* strings which should not be written into */ /* the log file */ prog.__LogExcludeWords = screen.__fgYellow , screen.__highlight , screen.__AttrOff , screen.__DelEOL /* ------------------------------ */ /* init the global variables */ onlySelectedApps = 0 curApps.0 = 0 /* ------------------------------ */ /* unprintable chars for the screen output */ global.__testString = xrange( '00'x, '1F'x ) || xrange( '7F'x, 'FF'x ) /* ------------------------------ */ /* get the parameter of the program */ parse arg curIniFile curREXXProg applications /* convert the filenames to uppercase */ parse upper var curIniFile curIniFile parse upper var curREXXProg curREXXProg /* check the parameter */ if curIniFile = '' | curREXXProg = '' then call ShowError 1, 'Parameter missing' if curIniFile <> 'USER' & curIniFile <> 'SYSTEM' then if stream( curIniFile, 'c', 'QUERY EXIST' ) = '' then call ShowError 2, 'Inifile "' || curIniFile || '" not found' if stream( curREXXProg, 'c', 'QUERY EXIST' ) <> '' then call ShowError 3, 'Outputfile "' || curREXXProg || '" already exist' if applications <> '' then do /* check for the #1 - #2 format */ parse var applications fromApp '-' toApp if datatype( fromApp ) = 'NUM' & dataType( toApp ) = 'NUM' then do /* application parameter is in the #1 - #2 format */ onlySelectedApps = 2 end /* if datatype( fromApp ) = 'NUM' & dataType( toApp ) = 'NUM' then */ else do /* application parameter is in the format */ /* app1 ... app# */ /* -> split the parameter into the application */ /* names (use " or ' to surround application */ /* names with imbedded blanks) */ onlySelectedApps = 1 i = curApps.0 do while applications <> '' applications = strip( applications ) parse var applications tc +1 if tc = '"' | tc = "'" then parse var applications (tc) curApp (tc) applications else parse var applications curApp applications i = i +1; curApps.i = curApp end /* do while applications <> '' */ curApps.0 = i end /* else */ end /* if applications <> '' then */ /* ------------------------------------------ */ /* load the dll REXXUTIL */ global.__rexxUtilLoaded = LoadDll(, 'SysLoadFuncs', , /* dll init function */ 'REXXUTIL', , /* dll name */ 'SysLoadFuncs', , /* dll init entry point */ '' , /* dll exit function */ 'SysDropFuncs', , /* check function */ 1, , /* 1: ignore rc of rxfuncadd (for WARP) */ '', , /* errorcode of the init function */ 1 ) /* 1: abort if loading failed */ /* 0: do not abort if loading failed */ /* ------------------------------ */ /* create the stem with the applications to */ /* convert */ call log ' Reading the file ' || AddColor1( '"', curIniFile ) call log ' Creating the REXX program ' || AddColor1( '"', curREXXProg ) select when onlySelectedApps = 2 then do /* convert the applications #n to #m */ /* read the whole INI file */ thisRC = SysIni( curIniFile, 'ALL:', 'tempApps.' ) if thisRC = 'ERROR:' then call ShowError 4, 'Error reading the ini file' if toApp = '-1' then toApp = tempApps.0 call log ' Converting applications no. ' || AddColor1( , fromApp ) || , ' to no. ' || Addcolor1( , toApp ) j = curApps.0 do i = fromApp to toApp by 1 if i > tempApps.0 then leave j = j+1; curApps.j = tempApps.i end /* do i = fromApp to toApp by 1 */ curApps.0 = j drop tempApps. end /* when */ when onlySelectedApps = 0 then do /* convert ALL applications */ call log ' Converting ' || AddColor1( , 'ALL' ) || ' applications.' /* read the whole INI file */ thisRC = SysIni( curIniFile, 'ALL:', 'curApps.' ) if thisRC = 'ERROR:' then call ShowError 4, 'Error reading the ini file' call log ' ' || AddColor1( , curApps.0 ) || , ' application(s) found in the ini file.' end /* when curApps.0 = 0 then */ otherwise do /* convert only selected applications */ call log ' Converting ' || AddColor1( , curApps.0 ) || ' applications.' end /* otherwise */ end /* select */ /* read the applications from the INI file */ appsStem.0 = 0 do i = 1 to curApps.0 thisApp = curApps.i call log ' Reading the application ' || AddColor1( '"', thisApp ) , '(' || i || ' of ' || curApps.0 || ') ...' thisRC = SysIni( curIniFile, thisApp, 'ALL:', 'tempStem.' ) if thisRC = 'ERROR:' then call ShowWarning 'Error reading the application "' || thisApp || '"!' else do call log ' ' || AddColor1( , tempStem.0 ) || , ' keys found for this application.' j = AppsStem.0+1 AppsStem.j.__name = thisApp AppsStem.j.__Keys.0 = 0 AppsStem.0 = j call log ' Reading the keys for this application ...' n = 0 do k = 1 to tempStem.0 thisKey = tempStem.k call log ' Reading the key ' || AddColor1( '"', thisKey ) thisRC = SysIni( curIniFile, thisApp, thisKey ) if thisRC = 'ERROR:' then call ShowWarning 'Error reading the key "' ||, thisKey || '" of the application "' || , thisApp || '"!' else do n = n +1 AppsStem.j.__Keys.n.__Key = thisKey AppsStem.j.__Keys.n.__Val = thisRC end /* else */ end /* do k = 1 to tempStem.0 */ AppsStem.j.__Keys.0 = n end /* else */ drop tempStem. end /* do i = 1 to curApps.0 */ /* ------------------------------ */ /* define some constants used in the code to */ /* create the REXX program */ crLf = '0D0A'x cmtStart = '/' || '* ' cmtEnd = ' *' || '/' cmtEnd1 = cmtEnd || crLF separatorLine = cmtStart || copies( '-', 66 ) || cmtEnd1 emptyCmtLine = cmtStart || copies( ' ', 66 ) || cmtEnd1 progDesc = , cmtStart ||, 'REXX program to recreate some or all entries of the INI file ' || , cmtEnd1 /* write the header for the output file */ call log ' Writing the output file ...' call log ' Writing the header ...' call LineOut curREXXProg ,, separatorLine || , cmtStart || left( fileSpec( 'N', curREXXProg ), 66 ) || cmtEnd1 || , emptyCmtLine || , progDesc || , cmtStart || ' ' || left( fileSpec( 'N', curIniFile ), 64 ) || cmtEnd1 || , emptyCmtLine || , cmtStart || 'Created on ' || date() || ' at ' || time() || , ' with ' || cmtEnd1 || , cmtStart || ' ' || left( prog.__name, 64 ) || cmtEnd1 || , emptyCmtLine || , separatorLine || , crLF || , cmtStart || ' --------------- Name of the ini file to create or update ' || cmtEnd1 || , ' curIniFile = "' || curIniFile || '"' || crlf , crLF || , cmtStart || ' --------------- load the necessary REXXUTIL function(s) ' || cmtEnd1 || , ' call rxFuncAdd "SysIni", "REXXUTIL", "SysIni"' || crLF , crLF || , separatorLine || crLF || , crLF || , cmtStart || ' --------------- init the stem with the data ' || cmtEnd1 || , ' iniFileApps.0 = 0 ' || crLF || , ' i = iniFileApps.0 ' || crLF call log ' Writing the stem with the data ...' do i = 1 to AppsStem.0 curApp = AppsStem.i.__Name call log ' Writing the keys for the application ' || , AddColor1( '"', curApp ) call LineOut curREXXProg ,, crLF || , separatorLine || , cmtStart 'Application: ' || curApp || cmtEnd1 || , crLF || , ' i=i+1' || crLF || , ' IniFileApps.i.__Application = ' || , ConvertString( AppsStem.i.__Name, 33,32 ) || crLF || , ' IniFileApps.i.__Keys.0 = 0 ' || crLF || , crLF || , ' j = IniFileApps.i.__Keys.0 ' || crLF || , '' do j = 1 to AppsStem.i.__Keys.0 curKey = AppsStem.i.__Keys.j.__Key call log ' Writing the key ' || AddColor1( '"', curKey ) call LineOut curREXXProg ,, ' j = j+1 ' || crLF || , ' IniFileApps.i.__Keys.j.__Key = ' || , ConvertString( AppsStem.i.__Keys.j.__Key, 33, 32 ) || crLF || , ' IniFileApps.i.__Keys.j.__Val = ' || , ConvertString( AppsStem.i.__Keys.j.__Val, 33, 32 ) || crLF || , '' end /* do j = 1 to AppsStem.j.__Keys.0 */ call LineOut curREXXProg ,, ' IniFileApps.i.__Keys.0 = j ' || crLF || , '' end /* do i = 1 to AppsStem.0 */ call LineOut curREXXProg , , separatorLine || , crLF || , ' iniFileApps.0 = i ' || crLF || , '' call log ' Writing the code to write the data to the ini file ...' call LineOut curREXXProg ,, separatorLine || , ' say "Creating or updating the ini file " ' || crLF || , ' say " " || curIniFile ' || crLF || , ' say "(" || iniFileApps.0 || " applications.)" ' || crLF || , ' say "" ' || crLF || , ' say "Press any key to continue or CTRL-C to abort ..." ' || crLF || , ' "@PAUSE >NUL" ' || crLF || , ' ' || crLF || , ' do i = 1 to IniFileApps.0 ' || crLF || , ' ' || crLF || , ' curApplication = IniFileApps.i.__Application ' || crLF || , ' ' || crLF || , ' say " Writing the keys for the application """ || , ' || crLF || , ' ConvertString( curApplication ) || , ' || crLF || , ' """ (" || i || " of " || IniFileApps.0 || ")" ' || crLF || , ' ' || crLF || , ' do j = 1 to IniFileApps.i.__Keys.0 ' || crLF || , ' curKey = IniFileApps.i.__Keys.j.__Key ' || crLF || , ' curVal = IniFileApps.i.__Keys.j.__Val ' || crLF || , ' ' || crLF || , ' say " Writing the key """ || , ' || crLF || , ' convertString( curKey ) || , ' || crLF || , ' """ (" || j || " of " || , ' || cRLF || , ' IniFileApps.i.__Keys.0 || ")" ' || crLF || , ' ' || crLF || , ' thisRC = SysIni( curIniFile,, ' || crLF || , ' curApplication,, ' || crLF || , ' curKey,, ' || crLF || , ' curVal ) ' || crLF || , ' if thisRC = "ERROR:" then ' || crLF || , ' say "Warning: Error writing the key <" || , ' || crLF || , ' ConvertString( curKey ) || ">!" ' || crLF || , ' end /* do j = 1 to IniFileApps.i.__Keys.0 */ ' || crLF || , ' ' || crLF || , ' end /* do i = 1 to IniFileApps.0 */ ' || crLF || , ' ' || crLF || , 'exit ' || crLF || , ' ' || crLF || , separatorLine || crLF || , 'ConvertString: PROCEDURE ' || crLF || , ' parse arg sourceString ' || crLF || , ' return translate( sourceString,, ' || crLF || , ' "????????????????????????????????" ,, ' || crLF || , ' "000102030405060708090A0B0C0D0E0F"x || , ' || crLF || , ' "101112131415161718191A1B1C1D1E1F"x ) ' || crLF || , ' ' || crLF || , separatorLine || crLF || , '' /* ------------------------------ */ /* exit the program */ RETURN /* ------------------------------------------------------------------ */ /* Function: Split a string into sub strings */ /* */ /* Usage: ConvertString sourceString, indent, maxLength */ /* */ ConvertString: PROCEDURE expose (exposeList) crLF parse arg sourceString, indent, maxLength maxLength = maxLength % 2 i = verify( sourceString , global.__testString , 'MATCH' ) if pos( '"', sourceString ) <> 0 then stringDelimiter = "'" else stringDelimiter = '"' select when i = 0 then targetString = stringDelimiter || sourceString || stringDelimiter when i = length( sourceString ) then targetString = stringDelimiter || dbrright( sourceString,1 ) || , stringDelimiter || ' || "' || , c2x( right( sourceString, 1 ) ) || '"x' otherwise curLength = length( sourceString ) if curLength > maxLength then do LineEnd = ' || , ' || CrLF || copies( ' ', indent ) || '"' maxLength = maxLength + 1 parse var sourceString tempString =(maxLength) sourceString targetString = '"' || c2x( tempString ) || '"x' do until sourceString = '' parse var sourceString tempString =(maxLength) sourceString targetString = targetString || lineEnd || c2x( tempString ) || '"x' end /* do until sourceString = '' */ end /* if curLength > maxLength then */ else targetString = '"' || c2x( sourceString ) || '"x' end /* select */ RETURN targetString /* ------------------------------------------------------------------ */ /* Function: add quote chars and color codes to a string */ /* */ /* call: AddColor1( quoteChar ,myString ) */ /* */ /* where: quoteChar - leading and trailing character for the */ /* converted string (may be omitted) */ /* myString - string to convert */ /* */ /* returns: converted string */ /* */ AddColor1: PROCEDURE expose (exposeList) parse arg quoteChar, myString return quoteChar || screen.__fgYellow || screen.__highlight || , myString || , screen.__AttrOff || quoteChar /* ------------------------------------------------------------------ */ /* function: Show the invocation syntax */ /* */ /* call: called by the runtime system with */ /* => call ShowUsage */ /* */ /* where: - */ /* */ /* returns: '' */ /* */ /* Note: YOU SHOULD FILL THIS ROUTINE WITH CODE. */ /* You may change the return code for your program in this */ /* routine. The default for the return code is 253. */ /* (The variable for the return code is prog.__ExitCode) */ /* */ /* */ ShowUsage: PROCEDURE expose (exposeList) call ShowString I!.__GetMsg( 14 ) || ' ',, prog.__name global.__MyParms prog.__DefParms RETURN ' ' /* v3.03 */ /* ------------------------------------------------------------------ */ /*** End of Part 4 of the source code of TEMPLATE.CMD ***/ /**********************************************************************/