GETOPT.C
上传用户:bangxh
上传日期:2007-01-31
资源大小:42235k
文件大小:5k
源码类别:

Windows编程

开发平台:

Visual C++

  1. ///////////////////////////////////////////////////////////////////////////////
  2. //
  3. //  FILE: getopt.c
  4. //
  5. //      GetOption function
  6. //
  7. //  FUNCTIONS:
  8. //
  9. //      GetOption() - Get next command line option and parameter
  10. //
  11. //  COMMENTS:
  12. //
  13. ///////////////////////////////////////////////////////////////////////////////
  14. #include <stddef.h>
  15. #include <ctype.h>
  16. #include <string.h>
  17. #include "getopt.h"
  18. ///////////////////////////////////////////////////////////////////////////////
  19. //
  20. //  FUNCTION: GetOption()
  21. //
  22. //      Get next command line option and parameter
  23. //
  24. //  PARAMETERS:
  25. //
  26. //      argc - count of command line arguments
  27. //      argv - array of command line argument strings
  28. //      pszValidOpts - string of valid, case-sensitive option characters,
  29. //                     a colon ':' following a given character means that
  30. //                     option can take a parameter
  31. //      ppszParam - pointer to a pointer to a string for output
  32. //
  33. //  RETURNS:
  34. //
  35. //      If valid option is found, the character value of that option
  36. //          is returned, and *ppszParam points to the parameter if given,
  37. //          or is NULL if no param
  38. //      If standalone parameter (with no option) is found, 1 is returned,
  39. //          and *ppszParam points to the standalone parameter
  40. //      If option is found, but it is not in the list of valid options,
  41. //          -1 is returned, and *ppszParam points to the invalid argument
  42. //      When end of argument list is reached, 0 is returned, and
  43. //          *ppszParam is NULL
  44. //
  45. //  COMMENTS:
  46. //
  47. ///////////////////////////////////////////////////////////////////////////////
  48. int GetOption (
  49.     int argc,
  50.     char** argv,
  51.     char* pszValidOpts,
  52.     char** ppszParam)
  53. {
  54.     static int iArg = 1;
  55.     char chOpt;
  56.     char* psz = NULL;
  57.     char* pszParam = NULL;
  58.     if (iArg < argc)
  59.     {
  60.         psz = &(argv[iArg][0]);
  61.         if (*psz == '-' || *psz == '/')
  62.         {
  63.             // we have an option specifier
  64.             chOpt = argv[iArg][1];
  65.             if (isalnum(chOpt) || ispunct(chOpt))
  66.             {
  67.                 // we have an option character
  68.                 psz = strchr(pszValidOpts, chOpt);
  69.                 if (psz != NULL)
  70.                 {
  71.                     // option is valid, we want to return chOpt
  72.                     if (psz[1] == ':')
  73.                     {
  74.                         // option can have a parameter
  75.                         psz = &(argv[iArg][2]);
  76.                         if (*psz == '')
  77.                         {
  78.                             // must look at next argv for param
  79.                             if (iArg+1 < argc)
  80.                             {
  81.                                 psz = &(argv[iArg+1][0]);
  82.                                 if (*psz == '-' || *psz == '/')
  83.                                 {
  84.                                     // next argv is a new option, so param
  85.                                     // not given for current option
  86.                                 }
  87.                                 else
  88.                                 {
  89.                                     // next argv is the param
  90.                                     iArg++;
  91.                                     pszParam = psz;
  92.                                 }
  93.                             }
  94.                             else
  95.                             {
  96.                                 // reached end of args looking for param
  97.                             }
  98.                         }
  99.                         else
  100.                         {
  101.                             // param is attached to option
  102.                             pszParam = psz;
  103.                         }
  104.                     }
  105.                     else
  106.                     {
  107.                         // option is alone, has no parameter
  108.                     }
  109.                 }
  110.                 else
  111.                 {
  112.                     // option specified is not in list of valid options
  113.                     chOpt = -1;
  114.                     pszParam = &(argv[iArg][0]);
  115.                 }
  116.             }
  117.             else
  118.             {
  119.                 // though option specifier was given, option character
  120.                 // is not alpha or was was not specified
  121.                 chOpt = -1;
  122.                 pszParam = &(argv[iArg][0]);
  123.             }
  124.         }
  125.         else
  126.         {
  127.             // standalone arg given with no option specifier
  128.             chOpt = 1;
  129.             pszParam = &(argv[iArg][0]);
  130.         }
  131.     }
  132.     else
  133.     {
  134.         // end of argument list
  135.         chOpt = 0;
  136.     }
  137.     iArg++;
  138.     *ppszParam = pszParam;
  139.     return (chOpt);
  140. }