string_converter


  class string_converter {
  int _argc;
  char** _argv;
  char _argvb[12][80];
  char buf[BUFSIZ]; 
  public:
  string_converter(int argc, char** argv) {
          flatten(argc,argv);
          _argc = argc;
          _argv = argv;
          }
   
  string_converter(const char *s) {
          _argc = unflatten((char*)s, _argvb);
          _argv = (char**)_argvb;
          strcpy(buf,s);
          }
  
  char* str() { return buf; }
  
  int argc() { return _argc; }
  char* operator[](int i) { return _argvb[i]; }
  
  private:
  
  char* flatten(int argc,  char* argv[]) {
  char temp[BUFSIZ];
  buf[0]='\0';
  if (argc > 0)  { strcpy(buf,*argv++); argc--; }
  while (--argc >= 0) {
          temp[0] = '\0';
          sprintf(temp,"%s %s",buf,*argv++);
          strcpy(buf,temp);
          }
  return buf;
  }
  
  int unflatten(char* in,  char argv[12][80]) {
  int quoteon = 0; int cont = 1;
  char inbuf[BUFSIZ];
  strcpy(inbuf,in);
  char* b = inbuf;
  while (*b == ' ') b++;
  char* p = b;
  int i = 0;
  while ( *p != '\0' ) {
  i++;
  quoteon = 0; cont = 1;
  while ( *p != '\0' && cont ) {
          if ( *p == ' ' && !quoteon ) cont = 0;
          if ( *p == '"' ) quoteon = quoteon?0:1;
          if (cont) p++;
          }
  if ( *p == '\0' ) {
          strcpy(argv[i],b);
          return i;
  } else {
  	*p = '\0';
          strcpy(argv[i],b);
          p++;
          b = p;
          }
  }
  return i;
  }
  };

slide: string_converter