This is quoted.c in view mode; [Download] [Up]
//------------------------------------------------------------------------ // ^FILE: quoted.c - implement quoted strings // // ^DESCRIPTION: // This file implements that class defined in "quoted.h" // // ^HISTORY: // 05/01/92 Brad Appleton <brad@ssd.csd.harris.com> Created //-^^--------------------------------------------------------------------- #include <stdlib.h> #include <iostream.h> #include <string.h> #include <ctype.h> #include "quoted.h" //--------------------------------------------------------------- Constructors QuotedString::QuotedString(unsigned max_size) : size(max_size) { buffer = new char[size] ; } QuotedString::QuotedString(const char * str) { size = ::strlen(str + 1); buffer = new char[size]; if (buffer) ::strcpy(buffer, str); } QuotedString::QuotedString(const char * str, unsigned max_size) : size(max_size) { buffer = new char[size]; if (buffer) ::strcpy(buffer, str); } QuotedString::QuotedString(const QuotedString & qstr) : size(qstr.size) { buffer = new char[size]; if (buffer) ::strcpy(buffer, qstr.buffer); } //--------------------------------------------------------------- Destructor QuotedString::~QuotedString(void) { delete [] buffer ; } //--------------------------------------------------------------- Assignment QuotedString & QuotedString::operator=(const QuotedString & qstr) { delete [] buffer ; size = qstr.size; buffer = new char[size]; if (buffer) ::strcpy(buffer, qstr.buffer); return *this ; } QuotedString & QuotedString::operator=(const char * str) { delete [] buffer ; size = ::strlen(str) + 1; buffer = new char[size]; if (buffer) ::strcpy(buffer, str); return *this ; } //--------------------------------------------------------------- operator>> istream & operator>>(istream & is, QuotedString & qstr) { // get the first non-white character char ch; is >> ch; if (! is) { if (is.eof()) { cerr << "Premature end of input.\n" << "\texpecting a single or a double quote." << endl ; } else { cerr << "Unable to extract quoted string from input." << endl ; } return is; } int single_quote = 0, double_quote = 0; switch (ch) { case '\'' : single_quote = 1; break; case '"' : double_quote = 1; break; default : cerr << "Unexpected character '" << ch << "'.\n" << "\texpecting a single or a double quotation mark." << endl ; is.clear(ios::failbit); return is; } //switch // Now fetch into "dest" until we see the ending quote. char * dest = qstr.buffer; unsigned end_quote = 0; unsigned len = 0; int c; while (! end_quote) { int escape = 0; c = is.get(); if (! is) { if (is.eof()) { cerr << "Unmatched " << (single_quote ? "\"'\"" : "'\"'") << "quote." << endl ; } else { cerr << "Unable to extract quoted string from input." << endl ; } return is; } if (c == '\\') { escape = 1; c = is.get(); if (! is) { if (is.eof()) { cerr << "Unmatched " << (single_quote ? "\"'\"" : "'\"'") << " quote." << endl ; } else { cerr << "Unable to extract quoted string from input." << endl ; } return is; } } if ((c == '\'') && single_quote && !escape) { end_quote = 1; } else if ((c == '"') && double_quote && !escape) { end_quote = 1; } else if (len < qstr.size) { dest[len++] = c; } else { cerr << "Error - quoted string is too long.\n\tmust be less than " << qstr.size << " characters." << endl ; is.clear(ios::failbit); return is; } } //while dest[len++] = '\0' ; // dont forget to NUL-terminate return is; }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.