/** * util.cpp * Yet Another SIP Stack * This file is part of the YATE Project http://YATE.null.ro * * Yet Another Telephony Engine - a fully featured software PBX and IVR * Copyright (C) 2004 Null Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include namespace TelEngine { // Utility function, checks if a character is a folded line continuation static bool isContinuation(char c) { return ((c == ' ') || (c == '\t')); } // Utility function, returns an unfolded line and advances the pointer String* getUnfoldedLine(const char** buf, int* len) { String* res = new String; const char* b = *buf; const char* s = b; int l = *len; int e = 0; for (;(l > 0); ++b, --l) { bool goOut = false; switch (*b) { case '\r': // CR is optional but skip over it if exists if ((l > 0) && (b[1] == '\n')) { ++b; --l; } case '\n': ++b; --l; { String line(s,e); *res << line; } // Skip over any continuation characters at start of next line goOut = true; while ((l > 1) && isContinuation(b[1])) { ++b; --l; goOut = false; } s = b; if (isContinuation(s[0])) ++s; e = 0; break; case '\0': // Should not happen - but let's accept what we got *res << s; goOut = true; break; default: // Just count this character - we'll pick it later ++e; } // Exit without adjusting p and l if (goOut) break; } *buf = b; *len = l; res->trimBlanks(); return res; } } /* vi: set ts=8 sw=4 sts=4 noet: */