home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 7 / 07.iso / c / c082_144 / 1.ddi / WINLBSRC.ZIP / SETARGV.C < prev    next >
Encoding:
C/C++ Source or Header  |  1992-06-10  |  5.6 KB  |  197 lines

  1. /*------------------------------------------------------------------------
  2.  * filename - setargv.c
  3.  *
  4.  * function(s)
  5.  *   _setargv (init proc)
  6.  *-----------------------------------------------------------------------*/
  7.  
  8. /*
  9.  *      C/C++ Run Time Library - Version 5.0
  10.  *
  11.  *      Copyright (c) 1987, 1992 by Borland International
  12.  *      All Rights Reserved.
  13.  *
  14.  */
  15.  
  16. #include <windows.h>
  17. #include <stdlib.h>
  18. #include <stdio.h>
  19. #include <string.h>
  20. #include <dos.h>
  21.  
  22. #pragma warn -use
  23.  
  24. #ifndef _WINDOWS
  25. #define _WINDOWS
  26. #endif
  27.  
  28. #define StrCpy strcpy
  29. #define strfncpy(dest, src, size)  movedata(FP_SEG(src), FP_OFF(src), \
  30.                                             FP_SEG(dest), FP_OFF(dest), size);
  31.  
  32. #define AllocHeap(size)     malloc(size)
  33. #define FreeHeap(handle)    free(handle)
  34. #define LockHeap(handle)
  35.  
  36. #define PSPCMDLEN   0x80
  37. #define PSPENV      0x2C
  38. #define MAXFNAMELEN 80
  39.  
  40. #define CR          '\r'
  41. #define EOS         '\0'
  42. #define QUOTE       '"'
  43. #define SPACE       ' '
  44. #define QUESTION    '?'
  45. #define ASTERICK    '*'
  46. #define TRUE        1
  47. #define FALSE       0
  48.  
  49. int  _argc = 1;
  50. char **_argv = NULL;
  51.  
  52. extern unsigned _hInstance;
  53. extern unsigned _pszCmdline;
  54. extern char *_argv0;
  55.  
  56. extern unsigned _envseg;
  57. extern unsigned _envLng;
  58. extern unsigned _envSize;
  59.  
  60. void _setargv(void)
  61. {
  62.     char far *farcmdline;
  63.     unsigned char far *farcmdlen;
  64.     char _FAR *cmdline;
  65.     char _FAR *savecmd;
  66.     char _FAR *endpoint;
  67.     char _FAR *start;
  68.     int inquote, done, found;
  69.     int length;
  70.  
  71.     farcmdline = MK_FP(_psp, _pszCmdline);
  72.     length = _fstrlen(farcmdline);
  73.  
  74.     savecmd = cmdline = AllocHeap((length)+1);
  75.     strfncpy(cmdline, farcmdline, (length)+1);
  76.  
  77.     endpoint = cmdline + length;
  78.  
  79.     while (*cmdline == SPACE)   /* strip leading white space */
  80.         *cmdline++ = EOS;
  81.  
  82.     inquote = done = FALSE;
  83.     start = cmdline;
  84.     while (!done)
  85.         {
  86.         found = 0;
  87.         while(*cmdline != EOS)
  88.             {
  89.             switch (*cmdline)
  90.                 {
  91.                 case QUOTE:
  92.                     // If not in quotes then one of two possibilities:
  93.                     // 1) Start of new argument
  94.                     // 2) End of argument and start of new one
  95.                     if (!inquote)
  96.                         {
  97.                         if (start == cmdline)
  98.                             {
  99.                             inquote = TRUE;   // in qoutes
  100.                             *cmdline = EOS;   // overwrite quote char
  101.                             cmdline++;
  102.                             start = cmdline;
  103.                             }
  104.                         else
  105.                             {
  106.                             *cmdline = EOS;   // overwrite quote char
  107.                             inquote = TRUE;   // but note that we got it
  108.                             }
  109.                         }
  110.                     // Else were in quotes
  111.                     else
  112.                         {
  113.                         *cmdline = EOS;       // overwrite quote char
  114.                         inquote = FALSE;      // and out of quotes
  115.                         }
  116.                     break;
  117.  
  118.                 case SPACE:
  119.                     // If not in quotes then overwtite, else increment
  120.                     // and note that we are in an argument
  121.                     if (!inquote)
  122.                         *cmdline = EOS;
  123.                     else
  124.                         {
  125.                         found++;
  126.                         cmdline++;
  127.                         }
  128.                     break;
  129.  
  130.                 case CR:
  131.                     // Overwite and set done flag
  132.                     *cmdline = EOS;
  133.                     done = TRUE;
  134.                     break;
  135.  
  136.                 default:
  137.                     // Otherwise increment and note that we have an argument
  138.                     cmdline++;
  139.                     found++;
  140.                     break;
  141.                 }
  142.             }
  143.  
  144.         if (cmdline >= endpoint)
  145.             done = TRUE;
  146.  
  147.         if (!done)
  148.             {
  149.             cmdline++;          // move past NULL
  150.             if (!inquote)       // skip spaces if we didn't start quotes
  151.                 while (*cmdline == SPACE)
  152.                     *cmdline++ = EOS;
  153.             start = cmdline;
  154.             }
  155.  
  156.         if (found)
  157.             _argc++;
  158.         }
  159.  
  160. /*========================================================================
  161.  *  1) number of arguments
  162.  *  2) size of arguments (slightly bloated)
  163.  *  3) length needed for Program path name
  164.  *
  165.  *  So, ((#1)*sizeof(* _argv))+(#2)+(#3) should be total size
  166.  *========================================================================
  167.  */
  168.  
  169. // set curptr to first byte past last argument pointer
  170. // set up argv[0]: copy commandline into beginning of buffer and update curptr
  171. // loop: set argv[i] and copy next argument to buffer updating curptr
  172. //
  173.     _argv = (char **) AllocHeap((sizeof(*_argv)*(_argc+1))+(length)+strlen(_argv0)+2);
  174.     start = (char *) &(_argv[_argc+1]);
  175.     _argv[0] = (char *)start;
  176.     StrCpy(start, _argv0);
  177.     start += strlen(start)+1;
  178.     cmdline = savecmd;
  179.  
  180.     for (done=1; done < _argc; done++)
  181.         {
  182.         _argv[done] = (char *)start;
  183.         while (*cmdline == EOS)     // skip to next argument
  184.             cmdline++;
  185.         StrCpy(start, cmdline);
  186.         found = strlen(start)+1;
  187.         start += found;
  188.         cmdline += found;
  189.         }
  190.     _argv[done] = NULL;
  191.     FreeHeap(_argv0);
  192.     _argv0 = _argv[0];
  193.     FreeHeap(savecmd);
  194. }
  195.  
  196. #pragma startup _setargv 10   // NOTE:  Must be executed after _setenv (8)
  197.