This is argiter.c in view mode; [Download] [Up]
//------------------------------------------------------------------------ // ^FILE: argiter.c - implementation of CmdLineArgIter subclasses // // ^DESCRIPTION: // This file implements the derived classes of a CmdLineArgIter that // are declazred in <cmdline.h>. // // ^HISTORY: // 04/03/92 Brad Appleton <brad@ssd.csd.harris.com> Created //-^^--------------------------------------------------------------------- #include <stdlib.h> #include <iostream.h> #include <string.h> #include <ctype.h> #include "cmdline.h" //-------------------------------------------------------- class CmdLineArgIter CmdLineArgIter::CmdLineArgIter(void) {} CmdLineArgIter::~CmdLineArgIter(void) {} //----------------------------------------------------------- class CmdArgvIter CmdArgvIter::~CmdArgvIter(void) {} const char * CmdArgvIter::operator()(void) { return ((index != count) && (array[index])) ? array[index++] : 0 ; } int CmdArgvIter::is_temporary(void) const { return 0; } //--------------------------------------------------------- class CmdStrTokIter static const char WHITESPACE[] = " \t\n\r\v\f" ; // Constructor CmdStrTokIter::CmdStrTokIter(const char * tokens, const char * delimiters) : tokstr(NULL), seps(NULL), token(NULL) { reset(tokens, delimiters); } // Destructor CmdStrTokIter::~CmdStrTokIter(void) { delete tokstr; } // Use a new string and a new set of delimiters void CmdStrTokIter::reset(const char * tokens, const char * delimiters) { seps = delimiters; if (seps == NULL) seps = WHITESPACE ; // use default delimiters delete tokstr; tokstr = NULL; token = NULL; if (tokens) { // Make a copy of the token-string (because ::strtok() modifies it) // and get the first token from the string // tokstr = new char[::strlen(tokens) + 1] ; (void) ::strcpy(tokstr, tokens); token = ::strtok(tokstr, seps); } } // Iterator function -- operator() // Just use ::strtok to get the next token from the string // const char * CmdStrTokIter::operator()(void) { if (seps == NULL) seps = WHITESPACE ; const char * result = token; if (token) token = ::strtok(NULL, seps); return result; } // The storage that we return pointers to (in operator()) // always points to temporary space. // int CmdStrTokIter::is_temporary(void) const { return 1; } //-------------------------------------------------------- class CmdIstreamIter const unsigned CmdIstreamIter::MAX_LINE_LEN = 1024 ; // Constructor CmdIstreamIter::CmdIstreamIter(istream & input) : is(input), tok_iter(NULL) { } // Destructor CmdIstreamIter::~CmdIstreamIter(void) { delete tok_iter; } #ifdef vms enum { c_COMMENT = '#' } ; #else enum { c_COMMENT = '!' } ; #endif // Iterator function -- operator() // // What we do is this: for each line of text in the istream, we use // a CmdStrTokIter to iterate over each token on the line. // // If the first non-white character on a line is c_COMMENT, then we // consider the line to be a comment and we ignore it. // const char * CmdIstreamIter::operator()(void) { const char * result = NULL; if (tok_iter) result = tok_iter->operator()(); if (result) return result; if (! is) return NULL; char buf[CmdIstreamIter::MAX_LINE_LEN]; do { *buf = '\0'; is.getline(buf, sizeof(buf)); char * ptr = buf; while (isspace(*ptr)) ++ptr; if (*ptr && (*ptr != c_COMMENT)) { if (tok_iter) { tok_iter->reset(ptr); } else { tok_iter = new CmdStrTokIter(ptr); } return tok_iter->operator()(); } } while (is); return NULL; } // We use a CmdStrTokIterator that is always temporary, thus the // the tokens we return are always in temporary storage // int CmdIstreamIter::is_temporary(void) const { return 1; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.