home *** CD-ROM | disk | FTP | other *** search
/ The World of Computer Software / World_Of_Computer_Software-02-386-Vol-2of3.iso / c / callbat.zip / CALL.C < prev    next >
C/C++ Source or Header  |  1992-12-22  |  7KB  |  160 lines

  1.                 /* * * * * * * * * * * * * * * * * * * * * * */
  2.                 /* CALL    (c) 1992, Jim Groeneveld, CMI-TNO */
  3.                 /* * * * * * * * * * * * * * * * * * * * * * */
  4. #define                          VERSION "0.1"
  5. #define                     DATE "22 December 1992"
  6.  
  7. /*----------------------------------------------------------------------------
  8.  Centrum voor Medische Informatica TNO       <Email>              |  |  |\/|
  9.  TNO Center for Medical Informatics | GROENEVELD@CMI.TNO.NL  |  \_/  |  |  |
  10.  ( CMI-TNO )    | Y. Groeneveld     | GROENEVELD@CMIHP1.UUCP | Jim Groeneveld
  11.  P.O.Box 124    | Wassenaarseweg 56 | GROENEVELD@TNO.NL      | Schoolweg 14
  12.  2300 AC Leiden | 2333 AL Leiden    |                        | 8071 BC Nunspeet
  13.  Nederland.     | (+31|0)71-181810  | Fax (+31|0)71-176382   | 03412-60413
  14.  *----------------------------------------------------------------------------
  15.  *
  16.  * Description: Support for the CALL prefix to .BAT files within batch files
  17.  *              for DOS versions below 3.3, which lack the internal command.
  18.  *
  19.  * Usage: CALL batch [any number of command line parameters]
  20.  *
  21.  * Initially developed and compiled with:
  22.  * PCC Compiler    V1.2c Copyright by Mark DeSmet, 1989   (SW)
  23.  * PCCL   Linker for PCC and PCCA  V1.2b Copyright by Mark DeSmet  1988
  24.  *
  25.  * Also adapted for, compatable with:
  26.  *        MICRO-C 2.0 by Dave Dunfield  1990   (SW)
  27.  *        ZORTECH C 1.07 by Walter Bright 1988 (commercial)
  28.  *        also tested with UNIX C
  29.  * The model used (DOS) is minimal: either tiny or small.
  30.  *----------------------------------------------------------------------------*/
  31.  
  32. /*-----------------------------------HEADER-----------------------------------*/
  33. #include <stdio.h>
  34.  
  35. /* #define DEBUG "DEBUG" */
  36. #define PCC 1        /* PCC is DeSmet */
  37. #define MC 2         /* MC is MICRO-C compiler */
  38. #define ZORTECH 3    /* ZORTECH C compiler */
  39. #define COMPILER ZORTECH /* PCC MC ZORTECH NULL */
  40.  
  41. #if COMPILER==MC     /* Micro-C preprocessor doesn't know/remove #if commands */
  42.   #define void char  /* Micro-C does not know a void type */
  43. #endif
  44.  
  45. #if COMPILER==ZORTECH     /* or some other compiler */
  46.   #include <string.h>
  47.   #include <stdlib.h>     /* system, getenv */
  48.   #include <process.h>    /* execlp */
  49. #endif
  50.  
  51. #if COMPILER==NULL /* any other compiler */
  52.   #include <string.h>
  53. #endif
  54.  
  55. /*-----------------------------------GLOBALS----------------------------------*/
  56. char CommandLine[127];
  57.  
  58. /*----------------HELP----------------help----------------HELP----------------*/
  59. void help()
  60. { fprintf (stderr,"\n%s %s %s\n",
  61.   "CALL.EXE (c) 1992 Jim Groeneveld, NL, version",VERSION,DATE);
  62.   fprintf (stderr,"%s\n%s\n","CALL command emulator for DOS « 3.3 .",
  63. #if COMPILER==MC
  64.   "Usage: CALL batch [up to 18 replaceable command line parameters]");
  65.                                                                     /*MICRO-C*/
  66. /* Split into separate parts, because MICRO-C compiled program crashes
  67.    if all in one. */
  68. #else
  69.   #if COMPILER==ZORTECH
  70.   "Usage: CALL batch [up to 31 replaceable command line parameters]");
  71.                                                                     /*ZORTECH*/
  72.   #else
  73.   "Usage: CALL batch [any number of command line parameters]");
  74.                                            /*PCC or maybe some other compiler*/
  75.   #endif
  76. #endif
  77. }
  78.  
  79. /*----------------MAIN----------------main----------------MAIN----------------*/
  80. main(argc,argv)
  81. int argc; char *argv[];                            /* command line arguments */
  82. { int i,ErrorLevel;
  83. #if COMPILER==ZORTECH
  84.   char *Command;
  85. #endif
  86.   if ( argc == 1 ) { help(); exit(255); };                /* print help info */
  87.  
  88. #if COMPILER==MC
  89.   for (i=0; i<=127; i++)
  90.   { CommandLine[i]='\0'; }   /* initialize string with binary 0 for MICRO-C */
  91. #else
  92.   #if COMPILER==PCC
  93.     strcat(CommandLine,"/C "); /* initialize string with "/C " for chain, PCC */
  94.   #endif
  95. #endif
  96.   for (i=1; i<argc; i++)
  97.   { strcat(CommandLine,argv[i]);
  98.     if (i<argc-1) strcat(CommandLine," ");
  99.   }
  100.  
  101. #ifdef DEBUG
  102.   fprintf (stderr,"%s=%d=%d\n",CommandLine,strlen(CommandLine),argc); /*DEBUG*/
  103. /* MICRO-C compiled program gets confused or even crashes with 20 arguments
  104.  * or more;
  105.  * ZORTECH-C compiled program accepts only up to 32 separate arguments; more
  106.  * arguments may crash the system;
  107.  * PCC compiled program accepts any number of arguments within 128 line length.
  108.  */
  109. #endif
  110.  
  111. #if COMPILER==PCC           /* PCC only; does not know 'system' function */
  112.   chain("C:\COMMAND.COM",CommandLine);    /* or 'exec' function */
  113. /* Assuming COMSPEC=C:\COMMAND.COM; PCC does not know 'getenv' either.
  114.  * COMMAND.COM could be tried to be found in several more or less standard
  115.  * locations (A:\;C:\;A:\DOS;C:\DOS;C:\SYSTEM), but that is cumbersome and
  116.  * not done. Instead another compiler should be used, supporting 'system'.
  117.  * Chain implicitely exits from program CALL without its own ErrorLevel.
  118.  */
  119. #else
  120.   #if COMPILER==ZORTECH
  121.     Command=getenv("COMSPEC");   /* (getenv with MC has different syntax) */
  122.     if ( Command != 0 ) ErrorLevel=execlp(Command,"","/c",CommandLine,NULL);
  123.     else ErrorLevel=execlp("Command","","/c",CommandLine,NULL);
  124.     /* execlp implicitely exits from CALL if successful */
  125.   #else
  126.     ErrorLevel=system(CommandLine);
  127.   #endif
  128.  
  129.   if ( ErrorLevel<0 )
  130.   { fprintf (stderr,"Command interpreter not found or insufficient memory\n");
  131.     ErrorLevel=254; /* ErrorLevel might be -1 */
  132.   }
  133.   exit(ErrorLevel); /* may be checked as DOS's ERRORLEVEL */
  134. #endif
  135. } /* end of main */
  136.  
  137. /*---------------------------- That's all folks! -----------------------------
  138.  
  139.    ---------------------------------History-----------------------------------
  140. Vs. 0.0    Initial working release in DOS BATch language and compiled with
  141. 11/12-92   the BATch file compiler BAT2EXEC 1.5 (c) 1990,
  142.            1991 Ziff Communications Co. PC Magazine ■ Douglas Boling,
  143.            mainly consisting of the essential DOS command lines:
  144.               SHIFT
  145.               %0 %1 %2 %3 %4 %5 %6 %7 %8 %9
  146.            Limitation: only a maximum of 9 replaceable command line parameters
  147.            supported, may be too less if called batch file applies SHIFTing.
  148. Vs. 0.1    Alternative release in C language, supporting any (or some) number of
  149. 22/12-92   arguments (depending on compiler) on a line of 127 bytes long.
  150.            Exit codes:
  151.              0 = normal termination
  152.            ??? = Errorlevels of CALLed programs (depending on compiler)
  153.            254 = COMMAND.COM not found or insufficient memory for shell
  154.            255 = no command added, help displayed
  155.  
  156.    ----------------------------------Future-----------------------------------
  157.  
  158.    ---------------------------------Remarks-----------------------------------
  159. */
  160.