yate/contrib/ysip/util.cpp

92 lines
2.2 KiB
C++

/**
* 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 <telengine.h>
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: */