home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / b / b430 / 1.ddi / UTILS / EXTERNAL / LAUNCH.C next >
Encoding:
C/C++ Source or Header  |  1990-06-15  |  1.9 KB  |  115 lines

  1. #include <direct.h>
  2. #include <dos.h>
  3.  
  4. #define FAR far
  5. #include "wztools.h"
  6.  
  7. #define INT    int
  8. #define HANDLE int
  9. #define CHAR   char
  10. #define PSTR   char *
  11. #define PCHAR  char *
  12. #define LPSTR  char FAR *
  13.  
  14. #define SW_SHOWNOACTIVATE   4
  15.  
  16. HANDLE FAR pascal WinExec(LPSTR, INT);
  17.  
  18. ROUT  rout;
  19. WZFUNC LaunchIndependent(PVAL pret, PVAL parg);
  20.  
  21. static PCHAR p2ccopy(LPSTR pstr, PCHAR cstr);
  22.  
  23. WZMAINFUNC main()
  24.  
  25. {
  26. rout.nrout = numfuncs;
  27. rout.exitfunc = 0;
  28.  
  29. rout.relts[0].pfunc = LaunchIndependent;
  30. rout.relts[0].name  = "\3app";
  31. rout.relts[0].narg  = 2;
  32.  
  33. return(&rout);
  34. }
  35.  
  36. INT         drive;
  37. INT         drives;
  38. INT         new;
  39. CHAR        szPath[67];
  40. LPSTR       lp;
  41. PCHAR       p;
  42. HANDLE      hInst;
  43. CHAR        buf[260];
  44.  
  45. WZFUNC LaunchIndependent(PVAL pret, PVAL parg)        
  46.  
  47. {
  48. pret->flag = ERR;    // default error
  49. pret->val.err = 12;  // Argument is bad
  50.  
  51. if (parg[0].flag != STRING)
  52.    return;
  53.  
  54. if (*(lp = parg[1].val.string))
  55.    {
  56.    _dos_getdrive(&drive);
  57.    
  58.    if (!getcwd(szPath, sizeof(szPath) - 1))
  59.       return;
  60.  
  61.    p = p2ccopy(lp, buf);
  62.  
  63.    if (p[1] == ':')
  64.       {
  65.       _dos_setdrive(p[0] & 31, &drives);
  66.       _dos_getdrive(&new);
  67.  
  68.       if (new != (p[0] & 31))
  69.          return;
  70.  
  71.       p += 2;
  72.       }
  73.  
  74.    if (*p && chdir(p) < 0)
  75.       goto CleanUp;
  76.    }
  77.  
  78. if ((hInst = WinExec(p2ccopy(parg->val.string, buf), SW_SHOWNOACTIVATE)) > 32)
  79.    {
  80.    pret->flag = NUMERIC;
  81.    pret->val.numeric = hInst;
  82.    }
  83.  
  84. CleanUp:
  85.  
  86. if (*parg[1].val.string)
  87.    {
  88.    _dos_setdrive(drive, &drives);
  89.    _dos_getdrive(&new);
  90.  
  91.    if (new == drive)
  92.       chdir(szPath);
  93.    }
  94. }
  95.  
  96. static PCHAR p2ccopy (LPSTR pstr, PCHAR cstr)
  97.  
  98. {
  99. INT count;
  100. LPSTR src;
  101. PCHAR dst;
  102.  
  103. dst = cstr;
  104.  
  105. if (pstr)
  106.    {
  107.     for (src = pstr + 1, count = pstr[0]; count; count--)
  108.       *dst++ = *src++;
  109.    }
  110.  
  111. *dst = 0;
  112.  
  113. return (cstr);
  114. }
  115.