home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 18 REXX / 18-REXX.zip / instfont.zip / FixFont2.cmd < prev    next >
OS/2 REXX Batch file  |  1996-10-14  |  17KB  |  469 lines

  1. /*------------------------------------------------------------------------*\
  2. |                                                                          |
  3. |           FIXFONT2.CMD - Version 1.0 - Version Date 1996-08-11           |
  4. |                                                                          |
  5. \*------------------------------------------------------------------------*/
  6. /*
  7.  
  8.    Remove all unregistered OS/2 Typ 1 fonts from M:\FONTS\PSFONTS and
  9.    M:\FONTS\PSFONTS\PFM
  10.  
  11.    Move all TrueType .FOT & .TTF files in Windows directories to
  12.    M:\FONTS\TRUETYPE and correct path on .FOT if necessary.
  13.  
  14. */
  15. GBL. = ''             /* initialize stem */
  16. parse Arg             GBL.CommandLine 
  17. parse Version         GBL.RexxVersion,
  18.                       GBL.RexxVersionLevel,
  19.                       GBL.RexxVersionDay,
  20.                       GBL.RexxVersionMonth,
  21.                       GBL.RexxVersionYear    .
  22. parse Source          GBL.OperatingSystem,
  23.                       GBL.CallingEnvironment,
  24.                       GBL.ProgramPathAndName   /* case is unreliable */   
  25.  
  26. parse value DATE('S') with,
  27.    year +4,
  28.    mm   +2,
  29.    dd
  30.  
  31. GBL.Environment     = 'OS2ENVIRONMENT'
  32. GBL.List            = 'GBL.'
  33. GBL.BootDrive       = LEFT( VALUE( 'RUNWORKPLACE',, GBL.Environment ), 2 )
  34. GBL.CurrentDate     = mm || '/' || dd || '/' || year
  35. GBL.Hostname        = VALUE( 'MACHINENAME',, GBL.Environment )
  36. GBL.Ramdrive        = VALUE( 'RAMDRIVE',, GBL.Environment )
  37. GBL.ProgramVersion  = 1.0           /* version / mod of this program */
  38. GBL.ProgramName     = STRIP( FILESPEC( 'N', GBL.ProgramPathAndName ) )
  39. GBL.ProgramPath     = STRIP( FILESPEC( 'D', GBL.ProgramPathAndName ) ||,
  40.                              FILESPEC( 'P', GBL.ProgramPathAndName ) )
  41.  
  42. parse var GBL.ProgramName,
  43.    GBL.ProgramFn  '.',
  44.    GBL.ProgramFe 
  45. GBL.ProgramFe  = TRANSLATE( GBL.ProgramFe  )
  46. call TIME 'R'                    /* reset elapsed timer - sssss.uuuuu */
  47. say 'Begin' GBL.ProgramFn || '.' || GBL.ProgramFe  'at' TIME('N')
  48.  
  49. /*------------------------*\
  50. |  Enable trap processing  |
  51. |    if REXXLIB present    |
  52. \*------------------------*/
  53.    SIGNAL ON ERROR
  54.    SIGNAL ON FAILURE
  55.    SIGNAL ON HALT
  56.    SIGNAL ON NOVALUE
  57.    SIGNAL ON SYNTAX
  58.  
  59. crlf               = '0D0A'x
  60. GBL.font_home_path = 'M:\FONTS\'
  61.  
  62. GBL.LogFile  =,
  63.    GBL.ProgramPath  ||,
  64.    GBL.ProgramFn  || '.LOG'
  65. if STREAM( GBL.LogFile, 'C', 'QUERY EXISTS' ) ¬= '' then
  66.    do
  67.       log_line = crlf || COPIES( '=', 76 )
  68.       call LINEOUT GBL.LogFile, log_line
  69.    end
  70. log_line = GBL.ProgramFn || '.' || GBL.ProgramFe || ' Started on' DATE() 'at' TIME() ' CPU:' GBL.Hostname '-' GBL.OperatingSystem
  71. call LINEOUT GBL.LogFile, log_line
  72.  
  73. /*------------------------------------------------------*\
  74. |  Create associative array with all PM_Font file names  |
  75. \*------------------------------------------------------*/
  76. ini_font_stem. = ''
  77. app_name = 'PM_Fonts'
  78. call SysIni 'USER', app_name, 'ALL:', 'ini_font_stem'
  79. if RESULT = 'ERROR:' then
  80.    do
  81.       log_line =,
  82.          'Unable to locate' app_name 'in' VALUE( 'USER_INI',, GBL.Environment )
  83.       call LINEOUT GBL.LogFile, log_line
  84.       say log_line
  85.       call EOJ
  86.    end
  87.  
  88. do i = 1 to ini_font_stem.0
  89.    key_name  = ini_font_stem.i
  90.    key_value = STRIP( SysIni( 'USER', app_name, key_name ), 'T', '00'x )
  91.    parse upper value FILESPEC( 'N', key_value ) with,
  92.       ini_font_fn '.' ini_font_fe
  93.    if ini_font_fe = 'FON' then iterate i
  94.    ini_font_stem.INI_FONT_FN = i
  95. end
  96.  
  97. /*------------------------------------*\
  98. |  Delete any unregistered font files  |
  99. |    from \PSFONTS & PSFONTS\PFM       |
  100. \*------------------------------------*/
  101. call SysFileTree GBL.font_home_path || 'PSFONTS\*.*' ,'stem', 'FST'
  102. if stem.0 = 0 then
  103.    do
  104.       say '   Unable to find any files'
  105.       call EOJ
  106.    end
  107.  
  108. do s = 1 to stem.0
  109.    parse upper value stem.s with,
  110.       stem_timestamp,
  111.       stem_size,
  112.       stem_attr,
  113.       stem_path_and_file_name
  114.    stem_path_and_file_name = STRIP( stem_path_and_file_name )
  115.  
  116.    parse value FILESPEC( 'N', stem_path_and_file_name ) with,
  117.       stem_fn '.' stem_fe
  118.  
  119.    if ini_font_stem.STEM_FN ¬= '' then iterate s
  120.  
  121.    call SysFileDelete stem_path_and_file_name
  122.    log_line =,
  123.       stem_path_and_file_name 'was deleted'
  124.    call LINEOUT GBL.LogFile, log_line
  125. end
  126.  
  127. /*-----------------------------------------------*\
  128. |  Table of path for all WIN.INI & ATM.INI files  |
  129. \*-----------------------------------------------*/
  130. p=0
  131. p=p+1; path_table.p = 'C:\WIN-311\'
  132. p=p+1; path_table.p = 'D:\OS2\MDOS\WINOS2\'
  133. p=p+1; path_table.p = 'F:\OS2\MDOS\WINOS2\'
  134. p=p+1; path_table.p = 'G:\OS2\MDOS\WINOS2\'
  135. p=p+1; path_table.p = 'H:\OS2\MDOS\WINOS2\'
  136. p=p+1; path_table.p = 'I:\OS2\MDOS\WINOS2\'
  137.        path_table.0 = p
  138.  
  139. do p = 1 to path_table.0
  140.    call ARRANGE_FOT_AND_TTF_FILES path_table.p || 'SYSTEM\'
  141. end
  142.  
  143. call STREAM GBL.LogFile, 'C', 'CLOSE'
  144.  
  145. call EOJ 0
  146.  
  147.  
  148. /*------------------------------------------------------------------------*\
  149. |                                                                          |
  150. |      Move TTF & FOT files to M:\FONTS\TRUETYPE & adjust path in FOT      |
  151. |                                                                          |
  152. \*------------------------------------------------------------------------*/
  153. ARRANGE_FOT_AND_TTF_FILES:
  154.    Procedure expose,
  155.       (GBL.List)
  156.  
  157. parse ARG system_path
  158.  
  159. log_line =,
  160.    'Move' system_path || '*.TTF to' GBL.font_home_path || 'TRUETYPE'
  161. call LINEOUT GBL.LogFile, log_line
  162. call STREAM  GBL.LogFile, 'C', 'CLOSE'
  163.  
  164. SIGNAL OFF ERROR
  165. SIGNAL OFF FAILURE
  166. '@copy' system_path || '*.TTF' GBL.font_home_path || 'TRUETYPE\*.* 1>>' || GBL.LogFile  '2>>&1'
  167. '@del'  system_path || '*.TTF 1>>' || GBL.LogFile  '2>>&1'
  168. SIGNAL ON ERROR
  169. SIGNAL ON FAILURE
  170.  
  171. fot_path_ptr  = X2D( 400 ) + 1
  172. fot_path_lgth = 96
  173.  
  174. call SysFileTree system_path || '*.FOT', 'fot_stem', 'FT'
  175. do f = 1 to fot_stem.0
  176.    parse value fot_stem.f with,
  177.       original_fot_timestamp,
  178.       original_fot_size,
  179.       original_fot_attr,
  180.       original_fot_path_and_file_name
  181.    original_fot_path_and_file_name = STRIP(original_fot_path_and_file_name)
  182.  
  183.    parse upper value FILESPEC( 'N', original_fot_path_and_file_name ) with,
  184.       original_font_fn '.' .
  185.  
  186.    /*---------------*\
  187.    |  Get .FOT file  |
  188.    \*---------------*/
  189.    fot_area = CHARIN( original_fot_path_and_file_name, 1, original_fot_size )
  190.    call STREAM original_fot_path_and_file_name, 'C', 'CLOSE'
  191.  
  192.    fot_change_count = 0
  193.  
  194.    /*--------------------------------------------------*\
  195.    |  Extract and clear TTF path & name from .FOT file  |
  196.    \*--------------------------------------------------*/
  197.    original_ttf_path_and_file_name =,
  198.       STRIP( SUBSTR( fot_area, fot_path_ptr, fot_path_lgth ), 'T', '00'x )
  199.    if FILESPEC( 'P', original_ttf_path_and_file_name ) = '' then
  200.       do
  201.          original_tth_path_and_file_name =,
  202.             system_path ||,
  203.             original_ttf_path_and_file_name
  204.       end
  205.  
  206.    /*--------------------------------------------*\
  207.    |  Write new .FOT if TTF in M:\FONTS\TRUETYPE  |
  208.    \*--------------------------------------------*/
  209.    new_fot_path_and_file_name =,
  210.       GBL.font_home_path || 'TRUETYPE\' || original_font_fn || '.FOT'
  211.    new_ttf_path_and_file_name =,
  212.       STREAM( GBL.font_home_path || 'TRUETYPE\' || original_font_fn || '.TTF',,
  213.               'C', 'QUERY EXISTS' )
  214.    if new_ttf_path_and_file_name ¬= '' then
  215.       do
  216.          fot_area =,
  217.             OVERLAY( COPIES( '00'x, fot_path_lgth ), fot_area, fot_path_ptr )
  218.          fot_area =,
  219.             OVERLAY( new_ttf_path_and_file_name, fot_area, fot_path_ptr )
  220.          call SysFileDelete new_fot_path_and_file_name
  221.          call CHAROUT new_fot_path_and_file_name, fot_area
  222.          call STREAM  new_fot_path_and_file_name, 'C', 'CLOSE'
  223.          call SysFileDelete original_fot_path_and_file_name
  224.          iterate f
  225.       end
  226.  
  227.    /*-------------------------------------------------------*\
  228.    |  Copy .FOT to M:\FONTS\TRUETYPE if TTF exist elsewhere  |
  229.    \*-------------------------------------------------------*/
  230.    if STREAM( original_ttf_path_and_file_name, 'C', 'QUERY EXISTS' ) ¬= '' then
  231.       do
  232.          call DOSCOPY original_fot_path_and_file_name, new_fot_path_and_file_name, 'R'
  233.          call SysFileDelete original_fot_path_and_file_name
  234.          iterate f
  235.       end
  236.  
  237.    /*--------------------------*\
  238.    |  No TTF file for FOT file  |
  239.    \*--------------------------*/
  240.    log_line =,
  241.       'Unable to locate' original_ttf_path_and_file_name',',
  242.       original_fot_path_and_file_name 'deleted'
  243.    call LINEOUT GBL.LogFile, log_line
  244.    call SysFileDelete original_fot_path_and_file_name
  245.  
  246. end
  247.  
  248. return
  249.  
  250.  
  251. !tr!=VALUE('TRACE',, GBL.Environment); if !tr!<>'' then do;say 'Trace' !tr! 'started'; TRACE(!tr!);nop;end
  252. /*------------------------------------------------------------------------*\
  253. |                                                                          |
  254. |                                End of Job                                |
  255. |                                                                          |
  256. \*------------------------------------------------------------------------*/
  257. EOJ:
  258.    Procedure expose,
  259.       GBL.
  260.  
  261. if ARG() = 0 then
  262.    eoj_rc = 0
  263. else
  264.    eoj_rc = ARG(1)
  265.  
  266. elapsed_time = TIME('E')            /* get elapsed time - sssss.uuuuu */
  267. parse value elapsed_time with seconds '.' micro_seconds
  268. if LEFT( micro_seconds, 1, 1 ) >= 5 then
  269.    seconds = seconds + 1
  270. ss = FORMAT( seconds // 60, 2 )
  271. minutes = ( seconds - ss ) / 60
  272. mm = FORMAT( minutes // 60, 2 )
  273. hh = FORMAT( ( minutes - mm ) / 60, 2 )
  274. duration = hh':'mm':'ss
  275.  
  276. say 'EOJ   ' || GBL.ProgramFn || '.' || GBL.ProgramFe 'at' TIME('N') ||,
  277.     ', duration' TRANSLATE( duration, '0', ' ' )
  278. exit eoj_rc
  279.  
  280. /*------------------------------------------------------------------------*\
  281. |                                                                          |
  282. |                              Trap Routines                               |
  283. |                                                                          |
  284. \*------------------------------------------------------------------------*/
  285. ERROR:       call TRAP_PROCESSING_01   SIGL, 'ERROR',   RC
  286. FAILURE:     call TRAP_PROCESSING_01   SIGL, 'FAILURE', RC
  287. HALT:        call TRAP_PROCESSING_01   SIGL, 'HALT',    ''
  288. LOGIC_ERROR: call TRAP_PROCESSING_01   SIGL, 'LOGIC',   ARG( 1 )
  289. NOVALUE:     call TRAP_PROCESSING_01   SIGL, 'NOVALUE', ''
  290. SYNTAX:      call TRAP_PROCESSING_01   SIGL, 'SYNTAX',  RC
  291.  
  292. TRAP_PROCESSING_01:
  293.    SIGNAL ON ERROR   name TRAP_PROCESSING_02 /* prevent recursion */
  294.    SIGNAL ON FAILURE name TRAP_PROCESSING_02 /* prevent recursion */
  295.    SIGNAL ON HALT    name TRAP_PROCESSING_02 /* prevent recursion */
  296.    SIGNAL ON NOVALUE name TRAP_PROCESSING_02 /* prevent recursion */
  297.    SIGNAL ON SYNTAX  name TRAP_PROCESSING_02 /* prevent recursion */
  298.    ?Trap.   = ''     /* Revised 98/12/18 */
  299.    TRAP_DMP = ''     /* .DMP path & file name */
  300.    TRAP_DMP_TIMESTAMP = DATE( ) || COPIES(' ', 2 ) || LEFT( TIME('L'),11 )
  301.  
  302. /*---------------------*\
  303. |  Program path & name  |
  304. \*---------------------*/
  305. parse Source  ?Trap.?OperatingSystem . ?Trap.?ProgramPathAndFileName
  306. parse Version ?Trap.?RexxVersion
  307.  
  308. ?Trap.?LineNumber = ARG( 1 )
  309. if POS( ':', ?Trap.?ProgramPathAndFileName ) > 0 then
  310.    /* get source line if it is available */
  311.    do ?T = 1
  312.       TRAP_SOURCE_LINE.?T =  SOURCELINE( ?Trap.?LineNumber )
  313.       TRAP_SOURCE_LINE.0  = ?T
  314.       if TRAP_SOURCE_LINE.?T == '' then
  315.          do
  316.             TRAP_SOURCE_LINE.?T = 'Source is not available'
  317.             leave
  318.          end
  319.       ?Trap.?LineNumber   = ?Trap.?LineNumber + 1
  320.       if RIGHT( TRAP_SOURCE_LINE.?T, 1 ) ¬== ',' then
  321.          do
  322.             leave
  323.          end
  324.    end
  325. else
  326.    /* program is running in macrospace */
  327.    do
  328.       ?Trap.?ProgramPathAndFileName =,
  329.          STRIP( DIRECTORY( ), 'T', '\' ) || '\' ||,
  330.          ?Trap.?ProgramPathAndFileName
  331.       TRAP_SOURCE_LINE.1 = 'Source line is not available.'
  332.       TRAP_SOURCE_LINE.0 = 1
  333.    end
  334.  
  335. parse value FILESPEC( 'N', ?Trap.?ProgramPathAndFileName ) with,
  336.    ?Trap.?Fn '.' ?Trap.?Fe
  337. TRAP_DMP =,
  338.    FILESPEC( 'D', ?Trap.?ProgramPathAndFileName ) ||,
  339.    FILESPEC( 'P', ?Trap.?ProgramPathAndFileName ) ||,
  340.    ?Trap.?Fn || '.' || 'DMP'
  341.  
  342. /*-------------------------------------------*\
  343. |  Determine whether ANSII or VX-REXX output  |
  344. \*-------------------------------------------*/
  345. ?Trap.?VXREXX = ( RxFuncQuery( 'VRWindow' ) = 0 )
  346. if ?Trap.?VXREXX then
  347.    do
  348.       /* see if Primary Window handle exists */
  349.       ?Trap.?VXREXX = ( LEFT( VRWindow( ), 1 ) = '?' )
  350.    end
  351.  
  352. /*------------------------------------------*\
  353. |  Check for reason NOT to create .DMP file  |
  354. \*------------------------------------------*/
  355. select
  356.    when ARG( 2 ) = 'HALT' then
  357.       do
  358.          TRAP_DMP = ''
  359.       end
  360.    when POS( ':', TRAP_DMP ) = 0 then
  361.       do
  362.          TRAP_DMP = ''
  363.       end
  364.    when ABBREV( ?Trap.?RexxVersion, 'OBJREXX' ) then
  365.       do
  366.          if RxFuncQuery( 'SysDumpVariables' ) <> 0 then
  367.             do
  368.                TRAP_DMP = ''
  369.             end
  370.       end
  371.    when ?Trap.?OperatingSystem = 'OS/2' then
  372.       do
  373.          if RxFuncQuery( 'VARDUMP' ) <> 0 then
  374.             do
  375.                TRAP_DMP = ''
  376.             end
  377.       end
  378.    otherwise
  379.       do
  380.          nop
  381.       end
  382. end
  383.  
  384. /*------------------------*\
  385. |  Build trap message box  |
  386. \*------------------------*/
  387. ?DBL.H     = 'CD'x                 /* ═ double line - horizontal   */
  388. ?DBL.V     = 'BA'x                 /* ║ double line - vertical     */
  389. ?DBL.BL    = 'C8'x                 /* ╚ double line - bottom left  */
  390. ?DBL.BR    = 'BC'x                 /* ╝ double line - bottom right */
  391. ?DBL.TL    = 'C9'x                 /* ╔ double line - top left     */
  392. ?DBL.TR    = 'BB'x                 /* ╗ double line - top right    */
  393. if ?Trap.?OperatingSystem ¬== 'WindowsNT' then
  394.    do
  395.       ?Trap.?RED = '1B'x || '[1;37;41m'  /* bright white on red    */
  396.       ?Trap.?DUL = '1B'x || '[0m'        /* reset to normal        */
  397.    end
  398. ?Trap.?Margin = COPIES( ' ', 2 )
  399.  
  400. TRAP_ERROR_DESCRIPTION =,
  401.    'Error line = ' || ARG( 1 ) || '; ' || ARG( 2 ) || ' trap caught'
  402. if ARG( 3 ) <> '' then
  403.    TRAP_ERROR_DESCRIPTION = TRAP_ERROR_DESCRIPTION ||,
  404.       '  Return code = ' || ARG( 3 )
  405.  
  406. ?T=0
  407. ?T=?T+1; ?Trap.?line.?T = ?Trap.?Fn'.'?Trap.?Fe
  408. ?T=?T+1; ?Trap.?line.?T = TRAP_ERROR_DESCRIPTION
  409. if TRAP_DMP <> '' then
  410.    do
  411. ?T=?T+1; ?Trap.?line.?T = ''
  412. ?T=?T+1; ?Trap.?line.?T = 'See: ' || TRAP_DMP
  413.    end
  414. ?T=?T+1; ?Trap.?line.?T = ''
  415. ?T=?T+1; ?Trap.?line.?T = 'Source line(s) at time of trap:'
  416. do ?S = 1 to TRAP_SOURCE_LINE.0
  417.    ?T=?T+1; ?Trap.?line.?T = ?Trap.?Margin || TRAP_SOURCE_LINE.?S
  418. end
  419.          ?Trap.?line.0 = ?T
  420. if ?Trap.?VXREXX then
  421.    do
  422.       ?Trap.?PrimaryWindowHandle = VRWindow( )
  423.       call VRSet  ?Trap.?PrimaryWindowHandle,,
  424.                   'BackColor',      'White',,
  425.                   'ForeColor',      'Red',,
  426.                   ''
  427.  
  428.       call VRMessageStem ?Trap.?PrimaryWindowHandle,,
  429.                          '?Trap.?line.',,
  430.                          CENTER( ?Trap.?Fn 'Fatal error', 74 ),,
  431.                          'E'
  432.    end
  433. else
  434.    do
  435.       ?Trap.?Width = MAX( 74, LENGTH( TRAP_ERROR_DESCRIPTION ) )
  436.       say ?Trap.?RED || ?DBL.TL || COPIES( ?DBL.H,?Trap.?Width + 2 ) || ?DBL.TR || ?Trap.?DUL
  437.       say ?Trap.?RED || ?DBL.V  || COPIES( ' ',   ?Trap.?Width + 2 ) || ?DBL.V  || ?Trap.?DUL
  438.       do ?T = 1 to ?Trap.?line.0
  439.       say ?Trap.?RED || ?DBL.V    LEFT( ?Trap.?line.?T, ?Trap.?Width )   ?DBL.V  || ?Trap.?DUL
  440.       end
  441.       say ?Trap.?RED || ?DBL.V  || COPIES( ' ',   ?Trap.?Width + 2 ) || ?DBL.V  || ?Trap.?DUL
  442.       say ?Trap.?RED || ?DBL.BL || COPIES( ?DBL.H,?Trap.?Width + 2 ) || ?DBL.BR || ?Trap.?DUL
  443.    end
  444.  
  445. /*---------------------------------*\
  446. |  Create .DMP file if appropriate  |
  447. \*---------------------------------*/
  448. if TRAP_DMP <> '' then
  449.    do
  450.       /* remove meaningless labels from dump for clarity */
  451.       drop ( GBL.DumpExclusionList )
  452.       drop ?dbl. ?Trap. ?S ?T ?tr?
  453.       call SysFileDelete TRAP_DMP
  454.       select
  455.          when RxFuncQuery( 'VARDUMP' ) == 0 then
  456.             do
  457.                call VARDUMP TRAP_DMP  /* write variables to program.DMP file */
  458.             end
  459.          when RxFuncQuery( 'SysDumpVariables' ) == 0 then
  460.             do
  461.                call SysDumpVariables TRAP_DMP  /* write variables to program.DMP file */
  462.             end
  463.          otherwise; nop
  464.       end
  465.    end
  466.  
  467. TRAP_PROCESSING_02:
  468.    exit 255
  469.