home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / perl501m.zip / OS2 / os2main.c < prev    next >
C/C++ Source or Header  |  1995-05-17  |  6KB  |  193 lines

  1. /*
  2.  * "The Road goes ever on and on, down from the door where it began."
  3.  */
  4.  
  5. #include "EXTERN.h"
  6. #include "perl.h"
  7.  
  8. #define INCL_BASE
  9. #include <os2.h>
  10.  
  11. #pragma pack(1)
  12. #define _Packed
  13. #define INCL_REXXSAA
  14. #include <rexxsaa.h>
  15. #pragma pack()
  16.  
  17. extern ULONG _emx_exception (    EXCEPTIONREPORTRECORD *,
  18.                 EXCEPTIONREGISTRATIONRECORD *,
  19.                                 CONTEXTRECORD *,
  20.                                 void *);
  21.  
  22. static void xs_init _((void));
  23. static PerlInterpreter *my_perl;
  24.  
  25. void
  26. usage(char *myname)
  27. {
  28.   printf("\nUsage: %s [switches] [filename] [arguments]\n", myname);
  29.  
  30.   printf("\n  -0[octal]       specify record separator (0, if no argument)"
  31.          "\n  -a              autosplit mode with -n or -p"
  32.          "\n  -c              syntaxcheck only"
  33.          "\n  -d              run scripts under debugger"
  34.          "\n  -Dnumber        set debugging flags (argument is a bit mask)"
  35.          "\n  -e command      one line of script, multiple -e options are allowed"
  36.          "\n                  [filename] can be ommitted, when -e is used"
  37.          "\n  -F regexp       regular expression for autosplit (-a)"
  38.          "\n  -i[extension]   edit <> files in place (make backup if extension supplied)"
  39.          "\n  -Idirectory     specify include directory in conjunction with -P"
  40.          "\n  -l[octal]       enable line ending processing, specifies line teminator"
  41.          "\n  -n              assume 'while (<>) { ... }' loop arround your script"
  42.          "\n  -p              assume loop like -n but print line also like sed"
  43.          "\n  -P              run script through C preprocessor before compilation"
  44. #ifndef HAS_FORK
  45.          "\n  -R              enable REXX variable pool"
  46. #endif
  47.          "\n  -s              enable some switch parsing for switches after script name"
  48.          "\n  -S              look for the script using PATH environment variable"
  49.          "\n  -v              print version number and patchlevel of perl"
  50.          "\n  -w              turn warnings on for compilation of your script\n"
  51.          "\n  -x[directory]   strip off text before #!perl line and perhaps cd to directory\n");
  52. }
  53.  
  54. static int    argc0;
  55. static char **    argv0;
  56. static char **    envp0;
  57. static int    exit0;
  58.  
  59. static ULONG
  60. StartPerl(PSZ name, ULONG argc, RXSTRING argv[], PSZ queue, PRXSTRING ret)
  61. {
  62.     int exitstatus;
  63.     EXCEPTIONREGISTRATIONRECORD xreg = { NULL, _emx_exception };
  64.  
  65. #ifndef HAS_FORK
  66.     DosSetExceptionHandler(&xreg);
  67. #endif
  68.  
  69.     my_perl = perl_alloc();
  70.     if (my_perl) {
  71.         perl_construct( my_perl );
  72.  
  73.         if ((exit0 = perl_parse( my_perl, xs_init, argc0, argv0, envp0 )) == 0) {
  74.             exit0 = perl_run( my_perl );
  75.  
  76.             perl_destruct( my_perl );
  77.             perl_free( my_perl );
  78.         }
  79.     } else
  80.         exit0 = 1;
  81.  
  82. #ifndef HAS_FORK
  83.     DosUnsetExceptionHandler(&xreg);
  84. #endif
  85.  
  86.     MAKERXSTRING(*ret, NULL, 0);
  87.     return 0;
  88. }
  89.  
  90. /* Register any extra external extensions */
  91.  
  92. static void
  93. xs_init()
  94. {
  95.     /* Do not delete this line--writemain depends on it */
  96.     char *file = __FILE__;
  97. #ifndef HAS_FORK
  98.     {   extern void boot_DynaLoader _((CV* cv));
  99.         newXS("DynaLoader::boot_DynaLoader", boot_DynaLoader, file);
  100.     }
  101. #endif
  102. #ifdef HAS_FORK
  103.     {   extern void boot_Socket _((CV* cv));
  104.         newXS("Socket::boot_Socket", boot_Socket, file);
  105.     }
  106.     {   extern void boot_POSIX _((CV* cv));
  107.         newXS("POSIX::boot_POSIX", boot_POSIX, file);
  108.     }
  109. #endif
  110. }
  111.  
  112. /*****************************************************************************/
  113.  
  114. int
  115. main(argc, argv, envp)
  116. int argc;
  117. char **argv;
  118. char **envp;
  119. {
  120.     int useREXX = 0;
  121.     int i;
  122.     char *cp;
  123.     RXSTRING args[1];
  124.     RXSTRING inst[2];
  125.     RXSTRING result;
  126.     USHORT   retcode;
  127.     static char cmd[] = "CALL StartPerl\r\n";
  128.  
  129.     _response(&argc, &argv);
  130.     _wildcard(&argc, &argv);
  131.  
  132.     tzset();
  133.  
  134.     /* Look for REXX option. */
  135.     for (i = 1; i < argc && *argv[i] == '-'; )
  136.         if (cp = strchr(argv[i]+1, 'R')) {
  137.             ++useREXX;
  138.             memmove(cp, cp+1, strlen(cp+1)+1);
  139.             if (!*(argv[i]+1)) {
  140.                 while (++i < argc)
  141.             argv[i-1] = argv[i];
  142.         argv[--argc] = NULL;
  143.             }
  144.         } else
  145.             ++i;
  146.  
  147.     if (argc <= 1) {
  148.         usage(argv[0]);
  149.         exit(1);
  150.     }
  151.  
  152.     DosError(FERR_DISABLEHARDERR | FERR_DISABLEEXCEPTION);
  153.  
  154.     argc0 = argc;
  155.     argv0 = argv;
  156.     envp0 = envp;
  157.  
  158. #ifndef HAS_FORK
  159.     if (useREXX) {
  160.     HMODULE hRexx, hRexxAPI;
  161.     BYTE    buf[200];
  162.     LONG    APIENTRY (*pRexxStart) (LONG, PRXSTRING, PSZ, PRXSTRING, PSZ, LONG, PRXSYSEXIT, PSHORT, PRXSTRING);
  163.     APIRET  APIENTRY (*pRexxRegisterFunctionExe) (PSZ, PFN);
  164.     APIRET  APIENTRY (*pRexxDeregisterFunction) (PSZ);
  165.  
  166.     if (DosLoadModule(buf, sizeof buf, "REXX", &hRexx)
  167.      || DosLoadModule(buf, sizeof buf, "REXXAPI", &hRexxAPI)
  168.      || DosQueryProcAddr(hRexx, 0, "RexxStart", (PFN *)&pRexxStart)
  169.      || DosQueryProcAddr(hRexxAPI, 0, "RexxRegisterFunctionExe", (PFN *)&pRexxRegisterFunctionExe)
  170.      || DosQueryProcAddr(hRexxAPI, 0, "RexxDeregisterFunction", (PFN *)&pRexxDeregisterFunction)) {
  171.         fprintf(stderr, "REXX not available\n");
  172.         exit(1);
  173.     }
  174.  
  175.         pRexxRegisterFunctionExe("StartPerl", (PFN)StartPerl);
  176.  
  177.         MAKERXSTRING(args[0], NULL, 0);
  178.         MAKERXSTRING(inst[0], cmd,  strlen(cmd));
  179.         MAKERXSTRING(inst[1], NULL, 0);
  180.         MAKERXSTRING(result,  NULL, 0);
  181.         pRexxStart(0, args, "StartPerl", inst, "Perl", RXSUBROUTINE, NULL, &retcode, &result);
  182.  
  183.         pRexxDeregisterFunction("StartPerl");
  184.  
  185.     DosFreeModule(hRexxAPI);
  186.     DosFreeModule(hRexx);
  187.     } else
  188. #endif
  189.         StartPerl(0, 0, 0, 0, &result);
  190.  
  191.     return exit0;
  192. }
  193.