home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / mcip100.zip / mci.cmd < prev    next >
OS/2 REXX Batch file  |  1999-01-01  |  12KB  |  399 lines

  1. /*
  2.  *      MCI.CMD - V1.0 C.Langanke 1998
  3.  *
  4.  *      Syntax: mci <mcifile>
  5.  *
  6.  *      mci is nan external batch processor for OS/2.
  7.  *      Call mci.cmd with a mci fila as only parameter
  8.  *      or put the line EXTPROC into the first line
  9.  *      of a cmd file in order to be able to use
  10.  *      the mci command language within that cmd file
  11.  *      (nothing else !).
  12.  *      Allowed comment characters are ; : and #
  13.  *
  14.  *      See sample MCI cmd files for additional commands, that
  15.  *      MCI.CMD implements. You can also use environment variables
  16.  *      like in conventional batch programming, just enclose them in
  17.  *      percent signs like %VAR%.
  18.  *
  19.  *      MCI sets the following environment variables:
  20.  *
  21.  *      %MCI_CALLDRIVE%  - drive of MCI source file
  22.  *      %MCI_CALLDIR%    - directory of MCI source file
  23.  *      %MCI_BOOTDRIVE%  - drive of OS/2 installation / bootdrive
  24.  *      %MCI_MMPMDRIVE%  - drive of MMPM installation
  25.  *      %MCI_MMPMDIR%    - directory of MMPM installation
  26.  */
  27. /* first comment is used as online help text */
  28.  
  29.  SIGNAL ON HALT
  30.  
  31.  TitleLine = STRIP(SUBSTR(SourceLine(2), 3));
  32.  PARSE VAR TitleLine CmdName'.CMD 'Info
  33.  Title     = CmdName Info
  34.  
  35.  env          = 'OS2ENVIRONMENT';
  36.  TRUE         = (1 = 1);
  37.  FALSE        = (0 = 1);
  38.  Redirection  = '> NUL 2>&1';
  39.  '@ECHO OFF'
  40.  
  41.  /* OS/2 Errorcodes */
  42.  ERROR.NO_ERROR           =  0;
  43.  ERROR.INVALID_FUNCTION   =  1;
  44.  ERROR.FILE_NOT_FOUND     =  2;
  45.  ERROR.PATH_NOT_FOUND     =  3;
  46.  ERROR.ACCESS_DENIED      =  5;
  47.  ERROR.NOT_ENOUGH_MEMORY  =  8;
  48.  ERROR.INVALID_FORMAT     = 11;
  49.  ERROR.INVALID_DATA       = 13;
  50.  ERROR.NO_MORE_FILES      = 18;
  51.  ERROR.WRITE_FAULT        = 29;
  52.  ERROR.READ_FAULT         = 30;
  53.  ERROR.GEN_FAILURE        = 31;
  54.  ERROR.INVALID_PARAMETER  = 87;
  55.  
  56.  GlobalVars = 'Title CmdName env TRUE FALSE Redirection ERROR.';
  57.  
  58.  /* show help */
  59.  ARG Parm .
  60.  IF ((Parm = '') | (POS('?', Parm) > 0)) THEN
  61.  DO
  62.     rc = ShowHelp();
  63.     EXIT(ERROR.INVALID_PARAMETER);
  64.  END;
  65.  
  66.  /* Defaults */
  67.  GlobalVars=GlobalVars 'LineCount MCIFile fTrace';
  68.  rc         = 0;
  69.  rcInit     = -1;
  70.  LineCount  = 0;
  71.  fTrace     = FALSE;
  72.  
  73.  SilentMCICommands = 'OPEN';     /* don't display values returned of those commands */
  74.  
  75.  CommentChars = ';:;';
  76.  
  77.  
  78.  DO UNTIL (1)
  79.  
  80.     /* read filename and check file */
  81.     PARSE ARG MCIFile
  82.     MCIFile = STRIP(MCIFile);
  83.     IF (\FileExist(MCIFile)) THEN
  84.     DO
  85.        SAY CmdNAme': error: file' MCIFile 'not found.';
  86.        rc = ERROR.FILE_NOT_FOUND;
  87.        LEAVE;
  88.     END;
  89.     MCIFile = STREAM(MCIFile, 'C', 'QUERY EXISTS');
  90.  
  91.     /* set environment vars */
  92.     rc = SETLOCAL();
  93.     BootDrive = GetInstDrive();
  94.     CallDir   = GetDrivePath( MCIFile);
  95.     CallDrive = FILESPEC('D', MCIFile);
  96.     IF (LENGTH(CallDir) = 2) THEN
  97.        CallDir = CallDir'\';
  98.     MmpmDrive = GetInstDrive('\MMOS2');
  99.     MmpmDir  = MmpmDrive'\MMOS2';
  100.  
  101.     rc = VALUE('MCI_CALLDRIVE', CallDrive, env);
  102.     rc = VALUE('MCI_CALLDIR',   CallDir,   env);
  103.     rc = VALUE('MCI_BOOTDRIVE', BootDrive, env);
  104.     rc = VALUE('MCI_MMPMDRIVE', MmpmDrive, env);
  105.     rc = VALUE('MCI_MMPMDIR',   MmpmDir,   env);
  106.  
  107.     /* initialise */
  108.     rc = RXFUNCADD('mciRxInit','MCIAPI','mciRxInit')
  109.     rcInit = mciRxInit();
  110.     IF ((rcInit \= 0)  & (rcInit \= 30)) then
  111.     DO
  112.        SAY 'error: MCI Interface could not be initialized. rc='rcInit;
  113.        LEAVE;
  114.     END;
  115.  
  116.     /* read file */
  117.     DO WHILE (LINES(MCIFile) > 0)
  118.  
  119.        ThisLine = LINEIN( MCIFile);
  120.        ThisLine = STRIP(ThisLine);
  121.        LineCount = LineCount + 1;
  122.  
  123.        /* ignore extproc command on first line */
  124.        IF ((LineCount = 1) & ( TRANSLATE(WORD(ThisLine, 1)) = 'EXTPROC')) THEN
  125.           ITERATE;
  126.  
  127.        /* skip empty lines */
  128.        IF (ThisLine = '') THEN ITERATE;
  129.  
  130.        /* skip comment lines */
  131.        IF (POS( LEFT(ThisLine, 1), CommentChars) > 0) THEN
  132.           ITERATE;
  133.  
  134.        /* trace enabled ? */
  135.        IF (fTrace) THEN
  136.           SAY ThisLine;
  137.  
  138.        /* replace environment vars */
  139.        ThisLine = ParseLine(ThisLine);
  140.  
  141.        /* check own commands */
  142.        Command = TRANSLATE(WORD(ThisLine, 1));
  143.  
  144.        SELECT
  145.  
  146.           /* --------------------------------------------------- */
  147.  
  148.           /* debug turns on display of commands */
  149.           WHEN (Command = 'TRACE') THEN
  150.              fTrace = TRUE;
  151.  
  152.           /* --------------------------------------------------- */
  153.  
  154.           /* echos a string */
  155.           WHEN (Command = 'ECHO') THEN
  156.           DO
  157.              PARSE VAR ThisLine . Message;
  158.              IF (RIGHT(Message, 1) = '^') THEN
  159.                 CALL CHAROUT, LEFT(Message, LENGTH(Message) - 1)' ';
  160.              ELSE
  161.                 SAY Message;
  162.           END;
  163.  
  164.           /* --------------------------------------------------- */
  165.  
  166.           /* pause option for asynchronous play mode */
  167.           WHEN (Command = 'PAUSE') THEN
  168.           DO
  169.              PARSE VAR ThisLine . Prompt;
  170.              IF (Prompt \= '') THEN
  171.              DO
  172.                 CALL CHAROUT, Prompt;
  173.                 'PAUSE' Redirection;
  174.              END;
  175.              ELSE
  176.                 'PAUSE';
  177.           END;
  178.  
  179.           /* --------------------------------------------------- */
  180.  
  181.           /* goto specified label */
  182.           WHEN (Command = 'GOTO') THEN
  183.           DO
  184.              PARSE VAR ThisLine . Label;
  185.              IF (Label  = '') THEN
  186.              DO
  187.                 SAY MCIFile'('LineCount'): error: no label specified for GOTO.';
  188.                 rc = ERROR.INVALID_DATA;
  189.                 LEAVE;
  190.              END;
  191.  
  192.              LineCountGoto = LineCount;
  193.              fLabelFound = FALSE;
  194.              LineCount = 0;
  195.  
  196.              /* jump to begin of file by closing and reopening it */
  197.              /* do not seek, because call is incompatible between classic and OO REXX */
  198.              rc = STREAM(MCIFile, 'C', 'CLOSE');
  199.  
  200.              DO WHILE (LINES(MCIFile) > 0)
  201.                 LineCount = LineCount + 1;
  202.                 ThisLine = LINEIN( MCIFile);
  203.                 ThisLine = TRANSLATE(STRIP(ThisLine));
  204.                 IF (ThisLine = '') THEN ITERATE;
  205.                 IF (WORD(ThisLine, 1) = ':'TRANSLATE(Label)) THEN
  206.                 DO
  207.                    fLabelFound = TRUE;
  208.                    LEAVE;
  209.                 END;
  210.              END;
  211.              IF (\fLabelFound) THEN
  212.              DO
  213.                 SAY MCIFile'('LineCountGoto'): error: label' Label 'not found.';
  214.                 rc = ERROR.INVALID_DATA;
  215.                 LEAVE;
  216.              END;
  217.           END;
  218.  
  219.           /* --------------------------------------------------- */
  220.  
  221.           /* play a track */
  222.           WHEN (Command = 'PLAYTRACK') THEN
  223.           DO
  224.              PARSE VAR ThisLine . ThisDevice ThisTrack ThisOptions;
  225.              ThisOptions = TRANSLATE(ThisOptions);
  226.  
  227.              /* check for repeat option */
  228.              fRepeatTrack = FALSE;
  229.              RepeatPos = WORDPOS('REPEAT', ThisOptions);
  230.              IF (RepeatPos \= 0) THEN
  231.              DO
  232.                 fRepeatTrack = TRUE;
  233.  
  234.                 /* remove repeat option */
  235.                 ThisOptions = DELWORD(ThisOptions, RepeatPos, 1);
  236.  
  237.                 /* add wait option */
  238.                 IF (WORDPOS('WAIT', ThisOptions) = 0) THEN
  239.                    ThisOptions = ThisOptions 'WAIT';
  240.              END;
  241.  
  242.              /* determine start and stop positions */
  243.              TrackPosStart = ProcessCommand( FALSE, TRUE, 'status' ThisDevice 'position track' ThisTrack 'wait');
  244.              TrackPosEnd = ProcessCommand( FALSE, FALSE, 'status' ThisDevice 'position track' ThisTrack + 1 'wait');
  245.              IF (TrackPosEnd \= '') THEN
  246.                 TrackPosEnd = 'to' TrackPosEnd;
  247.  
  248.              /* play the track */
  249.              DO UNTIL (\fRepeatTrack)
  250.                 rc = ProcessCommand( FALSE, TRUE, 'play' ThisDevice 'from' TrackPosStart TrackPosEnd ThisOptions);
  251.              END;
  252.           END;
  253.  
  254.           /* --------------------------------------------------- */
  255.  
  256.           /* execute MCI command */
  257.           OTHERWISE
  258.           DO
  259.              fDisplayCommand = (WORDPOS(Command, SilentMCICommands) = 0);
  260.              rc = ProcessCommand( fDisplayCommand, TRUE, ThisLine);
  261.           END;
  262.  
  263.        END; /* SELECT */
  264.  
  265.     END; /* DO WHILE (LINES(MCIFile) > 0) */
  266.  
  267.  END; /* DO UNTIL (1) */
  268.  
  269.  /* cleanup */
  270.  CALL mciRxExit;
  271.  
  272.  EXIT(rc)
  273.  
  274. /* ------------------------------------------------------------------------- */
  275. HALT:
  276.  SAY 'Interrupted by user.';
  277.  EXIT(ERROR.GEN_FAILURE);
  278.  
  279. SYNTAX:
  280.  SAY 'Interrupted by user.';
  281.  EXIT(ERROR.GEN_FAILURE);
  282.  
  283. /* ------------------------------------------------------------------------- */
  284. ShowHelp: PROCEDURE EXPOSE (GlobalVars)
  285.  
  286.  SAY;
  287.  SAY Title;
  288.  SAY;
  289.  
  290.  PARSE SOURCE . . ThisFile
  291.  
  292.  DO i = 1 TO 3
  293.     rc = LINEIN(ThisFile);
  294.  END;
  295.  
  296.  ThisLine = LINEIN(Thisfile);
  297.  DO WHILE (ThisLine \= ' */')
  298.     SAY SUBSTR(ThisLine, 7);
  299.     ThisLine = LINEIN(Thisfile);
  300.  END;
  301.  
  302.  rc = LINEOUT(Thisfile);
  303.  
  304.  RETURN('');
  305.  
  306. /* ------------------------------------------------------------------------- */
  307. FileExist: PROCEDURE
  308.  PARSE ARG FileName
  309.  
  310.  RETURN(STREAM(Filename, 'C', 'QUERY EXISTS') > '');
  311.  
  312. /* ------------------------------------------------------------------------- */
  313. GetInstDrive: PROCEDURE EXPOSE env
  314.  ARG DirName, EnvVarName
  315.  
  316.  /* Default: get OS2 directory: this is also the boot drive */
  317.  IF (DirName = '') THEN DirName = '\OS2';
  318.  
  319.  /* Default: search in PATH  */
  320.  IF (EnvVarName = '') THEN EnvVarName = 'PATH';
  321.  PathValue = VALUE(EnvVarName,,env);
  322.  
  323.  /* search entry and return drive letter */
  324.  DirName = ':'DirName';';
  325.  EntryPos = POS(DirName, PathValue) - 1;
  326.  IF (EntryPos = -1) THEN
  327.     RETURN('');
  328.  InstDrive = SUBSTR(PathValue, EntryPos, 2);
  329.  RETURN(InstDrive);
  330.  
  331. /* ------------------------------------------------------------------------- */
  332. GetDrivePath: PROCEDURE
  333.  PARSE ARG FileName
  334.  
  335.  FullPath = FILESPEC('D', FileName)||FILESPEC('P', FileName);
  336.  IF (FullPath \= '') THEN
  337.     RETURN(LEFT(FullPath, LENGTH(FullPath) - 1));
  338.  ELSE
  339.     RETURN('');
  340.     
  341.    
  342.  
  343. /* ------------------------------------------------------------------------- */
  344. ParseLine: PROCEDURE EXPOSE env
  345.  PARSE ARG ThisLine
  346.  
  347.  Delimiter = '%';
  348.  
  349.  ThisLineCopy = '';
  350.  CurrentPos   = 1;
  351.  
  352.  /* search var */
  353.  VarStart = POS(Delimiter, ThisLine);
  354.  DO WHILE (VarStart > 0)
  355.  
  356.     VarEnd       = Pos(Delimiter, ThisLine, VarStart + 1);
  357.     ThisVar      = SUBSTR(ThisLine, VarStart + 1, VarEnd - VarStart - 1);
  358.     ThisVarValue = VALUE(ThisVar,,env);
  359.  
  360.     /* extend copy with value */
  361.     ThisLineCopy = ThisLineCopy||,
  362.                    SUBSTR(ThisLine, CurrentPos, VarStart - CurrentPos)||,
  363.                    ThisVarValue;
  364.     CurrentPos   = VarEnd + 1;
  365.  
  366.     /* search next occurrence of var */
  367.     VarStart = POS(Delimiter, ThisLine, CurrentPos);
  368.  END;
  369.  
  370.  /* take also rest of line */
  371.  ThisLineCopy = ThisLineCopy||SUBSTR(ThisLine, CurrentPos);
  372.  
  373.  RETURN(ThisLineCopy);
  374. /* ========================================================================= */
  375. ProcessCommand: PROCEDURE EXPOSE (GlobalVars)
  376.  PARSE ARG fDisplayResult, fDisplayError, Command
  377.  
  378.  /* send comments */
  379.  SIGNAL ON SYNTAX;     /* let REXX handle double Ctrl-Break more properly */
  380.  rc = mciRxSendString( Command, 'ResultString', 0, 0);
  381.  SIGNAL OFF SYNTAX;
  382.  IF (rc \= 0) THEN
  383.  DO
  384.     IF (fDisplayError) THEN
  385.     DO
  386.        rcGetString = mciRxGetErrorString( rc, 'ErrorString');
  387.        SAY MCIFile'('LineCount'): error: ' Command;
  388.        SAY '-->' ErrorString;
  389.     END;
  390.  END;
  391.  ELSE
  392.  DO
  393.     IF ((ResultString \= '') & (fDisplayResult)) THEN
  394.        SAY ResultString;
  395.  END;
  396.  
  397.  RETURN(ResultString);
  398.  
  399.