home *** CD-ROM | disk | FTP | other *** search
/ Boldly Go Collection / version40.iso / TS / 17A / DRWIN101.ZIP / CMDLINE.CPP < prev    next >
C/C++ Source or Header  |  1991-12-12  |  4KB  |  199 lines

  1. #include <stdiostr.h>
  2. #include <string.h>
  3.  
  4. #include "cmdline.hpp"
  5.  
  6.  
  7. int AlwaysOne(char *s) { if (s == NULL) return 1; return 1; }
  8.  
  9.  
  10. //===========================================================================
  11.  
  12. void Parameter::operator = (Parameter& parameter)
  13. {
  14.   used   = parameter.used;
  15.   name   = parameter.name;
  16.   data   = parameter.data;
  17.   check  = parameter.check;
  18.   next   = parameter.next;
  19. }   //Parameter::operator = (Parameter& parameter)
  20.  
  21.  
  22. Parameter& Parameter::operator + (Parameter& parameter)
  23. {
  24.   Parameter* link = this;
  25.  
  26.   while (link->next != NULL) link = link->next;
  27.   link->next = ¶meter;
  28.   return *this;
  29. }   //Parameter::operator + (Parameter&)
  30.  
  31.  
  32. int Parameter::Load(char* arg)
  33. {
  34.   if (used) return 0;
  35.   used = 1;
  36.   if (!check(arg)) return 0;
  37.   strcpy((char*)data,arg);
  38.   return 1;
  39. }   //Parameter::Load(char* arg)
  40.  
  41.  
  42. ostream& Parameter::Out(ostream& o)
  43. {
  44.   o << name;
  45.   return o;
  46. }   //Parameter::Out(ostream& o)
  47.  
  48.  
  49. Parameter::Parameter(char* _name, char* _data, Check_Function _check)
  50. {
  51.   used   = 0;
  52.   name   = _name;
  53.   data   = _data;
  54.   check  = _check;
  55.   next   = NULL;
  56. }   //Parameter::Parameter(char* _name,Check_Function _check)
  57.  
  58.  
  59. Parameter::Parameter(Parameter& parameter)
  60. {
  61.   *this = parameter;
  62. }   //Parameter::Parameter(Parameter& parameter)
  63.  
  64.  
  65. //===========================================================================
  66.  
  67. ostream& Switch::Out(ostream& o)
  68. {
  69.   o << name << " (-" << switch_char << ", \"" << format << "\")";
  70.   return o;
  71. }   //Switch::Out(ostream& o)
  72.  
  73.  
  74. void Switch::operator = (Switch& s)
  75. {
  76.   name = s.name;
  77.   switch_char = s.switch_char;
  78.   data = s.data;
  79.   format = s.format;
  80.   scan = s.scan;
  81.   next = s.next;
  82. }   //Switch::operator = (Switch& s)
  83.  
  84.  
  85. Switch& Switch::operator + (Switch& s)
  86. {
  87.   Switch* link = this;
  88.  
  89.   while (link->next != NULL) link = link->next;
  90.   link->next = &s;
  91.   return *this;
  92. }   //Switch::operator + (Switch&)
  93.  
  94.  
  95. int Switch::Load(char* arg)
  96. {
  97.   if ((arg[0] != '-') && (arg[0] != '/')) return 0;
  98.   if (arg[1] != switch_char) return 1;
  99.   if (scan == NULL)
  100.     return sscanf(&arg[2],format,data);
  101.   else
  102.     return scan(data,&arg[2]);
  103. }   //Switch::Load(char* arg)
  104.  
  105.  
  106. Switch::Switch(char* _name, char _switch_char, void* _data, char* _format,
  107.        Scan_Function _scan)
  108. {
  109.   name        = _name;
  110.   switch_char = _switch_char;
  111.   data        = _data;
  112.   format      = _format;
  113.   scan        = _scan;
  114.   next = NULL;
  115. }   //Switch::Switch
  116.  
  117.  
  118. Switch::Switch(Switch& s)
  119. {
  120.   name = s.name;
  121.   switch_char = s.switch_char;
  122.   data   = s.data;
  123.   format = s.format;
  124.   scan   = s.scan;
  125.   next   = s.next;
  126. }   //Switch::Switch(Switch& s)
  127.  
  128.  
  129. //===========================================================================
  130.  
  131. CommandLine::CommandLine(Parameter& parameter, Switch& s)
  132. {
  133.   parameter_list = ¶meter;
  134.   switch_list = &s;
  135. }   //CommandLine::CommandLine(Parameter& parameter, Switch& s);
  136.  
  137.  
  138. int  CommandLine::Load(int argc,char* argv[])
  139. {
  140.   for (int i = 1; (i < argc); i++)
  141.   {
  142.     if ((argv[i][0] != '-') && (argv[i][0] != '/'))
  143.     {
  144.       Parameter* param = parameter_list;
  145.       while ((param != NULL) && (param->used)) param = param->next;
  146.       if (param != NULL) param->Load(argv[i]);
  147.     }
  148.     else
  149.     {
  150.       Switch* sw = switch_list;
  151.       while (sw != NULL)
  152.       {
  153.         if (sw->Load(argv[i]) == 0) return 0;
  154.         sw = sw->next;
  155.       }
  156.     }
  157.   }
  158.   return 1;
  159. }   //CommandLine::Load(int argc,char* argv[])
  160.  
  161.  
  162.  
  163. //===========================================================================
  164.  
  165. ostream& operator << (ostream& o,Parameter& p)
  166. {
  167.   return p.Out(o);
  168. }  //operator << (ostream& o,Parameter& p)
  169.  
  170. ostream& operator << (ostream& o,Switch& s)
  171. {
  172.   return s.Out(o);
  173. }  //operator << (ostream& o,Switch& s)
  174.  
  175.  
  176. ostream& operator << (ostream& o,CommandLine& c)
  177. {
  178.   o << "Command line has " << c.count << " loaded arguments:\n";
  179.  
  180.   int i = 0;
  181.   Parameter* p = c.parameter_list;
  182.   while (p != NULL)
  183.   {
  184.     o << "  param[" << i++ << "] = " << *p << "\n";
  185.     p = p->next;
  186.   }   //while
  187.  
  188.   Switch* s = c.switch_list;
  189.   i = 0;
  190.   while (s != NULL)
  191.   {
  192.     o << "  switch[" << i++ << "] = " << *s << "\n";
  193.     s = s->next;
  194.   }
  195.   return o;
  196. }  //operator << (ostream& o,CommandLine& c)
  197.  
  198.  
  199.