/*ident "@(#) @(#)std_win.c 1.1.1.3" */ /****************************************************************************** * * C++ Standard Library * * Copyright (c) 1996 Lucent Technologies. All Rights Reserved. * * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF Lucent Technologies. * The copyright notice above does not evidence any actual or * intended publication of such source code. * ******************************************************************************/ #include #include #include "std_string.h" #ifdef NAMESPACES_LUCENT namespace std { #endif #if (defined(_MSC_VER) && _MSC_VER < 1000) || defined(__TCPLUSPLUS__) #define WSTRING wstring #else #define WSTRING wstring::traits_type #endif // STREAMS INPUT/OUTPUT istream& operator>>(istream& ii, wstring& ss) { /* * skip whitespace -- return a null wstring if error encountered * while skipping whitespace */ if (!ii.ipfx(0)) { ss = wstring(); return ii; } register streambuf *nbp = ii.rdbuf(); int fwidth = ii.width(); if (fwidth != 0) { register int c = nbp->sgetc(); if (c == EOF) { /* no characters have been read in */ ss = wstring(); ii.clear(ios::badbit | ii.rdstate()); } else { ss.uniq(); ss.reserve(fwidth); wchar_t *start = ss.d->str; register wchar_t *p = start; while (c != EOF && --fwidth > 0) { wchar_t cvalue = c << 8; nbp->snextc(); // advance the pointer int c1 = nbp->sgetc(); cvalue += c1; if (c1 == EOF || WSTRING::is_del(cvalue)) { nbp->sputbackc(c); break; } *p++ = cvalue; nbp->snextc(); c = nbp->sgetc(); } ss.d->len = p - start; } return ii; } const int N = 64; int first = 1; /* * The first time through the loop, don't expand the size * of the existing wstring. On the second and succeeding * times, append the new characters to the end. */ while (ii && !ii.eof()) { register int c = nbp->sgetc(); if (c == EOF) break; wchar_t cvalue = (c << 8); nbp->snextc(); // advance the pointer int c1 = nbp->sgetc(); cvalue += c1; nbp->sputbackc(c); if (c1 == EOF || WSTRING::is_del(cvalue)) { break; } if (first) { first = 0; ss.uniq(); register int w = ss.d->max_size; wchar_t *start = ss.d->str; register wchar_t *p = start; while (c != EOF && --w > 0) { wchar_t cvalue = c << 8; nbp->snextc(); // advance the pointer int c1 = nbp->sgetc(); cvalue += c1; if (c1 == EOF || WSTRING::is_del(cvalue)) { nbp->sputbackc(c); break; } *p++ = cvalue; nbp->snextc(); c = nbp->sgetc(); } ss.d->len = p - start; } else { wchar_t buf[N]; register int w = N; register wchar_t *p = buf; while (c != EOF && --w > 0) { wchar_t cvalue = c << 8; nbp->snextc(); // advance the pointer int c1 = nbp->sgetc(); cvalue += c1; if (c1 == EOF || WSTRING::is_del(cvalue)) { nbp->sputbackc(c); break; } *p++ = cvalue; nbp->snextc(); c = nbp->sgetc(); } ss.append(buf, p - buf); } } if (first) { /* no characters have been read in */ ss = wstring(); ii.clear(ios::badbit | ii.rdstate()); } return ii; } istream& getline(istream &ii, wstring &ss, wchar_t delim) { register streambuf *nbp = ii.rdbuf(); const int N = 64; int fill_stringrep = 1; // normally set to 1 during the first time // through the main loop if (ss.d->max_size == 0) fill_stringrep = 0; // unless ss is a null string if (ii && (ii.eof() || nbp->sgetc() == EOF)) { ii.clear(ios::failbit | ii.rdstate()); return ii; } while (ii && !ii.eof()) { register int c = nbp->sgetc(); if (c == EOF) break; wchar_t cvalue = c << 8; int c1 = nbp->snextc(); cvalue += c1; if (c1 == EOF || cvalue == delim) { if (cvalue == delim) nbp->sbumpc(); break; } else c = nbp->snextc(); register int w = N; register wchar_t *p; if (fill_stringrep) { // first time through the loop -- overwrite the wstring // representation with the data you are reading in fill_stringrep = 0; w = ss.d->max_size; wchar_t *start = ss.d->str; p = start; *p++ = cvalue; while (c != EOF && --w > 0) { cvalue = c << 8; int c1 = nbp->snextc(); cvalue += c1; if (c1 == EOF || cvalue == delim) { if (cvalue == delim) nbp->sbumpc(); break; } *p++ = cvalue; c = nbp->snextc(); } ss.d->len = p - start; } else { // second and subsequent times through the loop -- fill the // array and append to the wstring wchar_t buf[N]; w = N; p = buf; *p++ = cvalue; while (c != EOF && --w > 0) { cvalue = c << 8; int c1 = nbp->snextc(); cvalue += c1; if (c1 == EOF || cvalue == delim) { if (cvalue == delim) nbp->sbumpc(); break; } *p++ = cvalue; c = nbp->snextc(); } if (p - buf > 0) ss.append(buf, p - buf); } if (cvalue == delim) { break; } } if (fill_stringrep) { ss = wstring(); } return ii; } #ifdef NAMESPACES_LUCENT } #endif