Files
MermsEmrWeb/mermsemr/src/core/util.cc
T
2019-02-19 22:35:27 +00:00

136 lines
3.8 KiB
C++

#include <stdio.h>
#include <string.h>
#include <regex.h>
#include "safestring.h"
#include "util.h"
#include "clog.h"
bool reg_match( const char * input, const char * regexp, char * ret, int sz, int * pos /*= NULL*/ )
{
regex_t compiled;
regmatch_t match[2];
bool satisfied = false;
if ( ret ) ret[0] = 0;
// logfmt( FLOG_MAX, "Matching '%s' against '%s'", input, regexp );
if ( regcomp( &compiled, regexp, REG_EXTENDED ) != 0 )
{
logfmt( logWARNING, "regcomp returned non-0, assuming a match" );
}
else
{
size_t r = regexec( &compiled, input, 2, match, 0 );
if ( r==0 ) // match
{
if ( pos )
*pos = match[1].rm_so;
int len = match[1].rm_eo-match[1].rm_so;
if ( ret )
strnsafecpy( ret, &input[ match[1].rm_so ], len, sz );
satisfied = true;
}
else
satisfied = false;
regfree( &compiled );
}
return satisfied;
}
char * urlencode( const char * buf, char * text, int sz )
{
// old char url[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ^_\\-0123456789."; // . ???
char url[] = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789$-_.!*'(),"; // $-_.+!*'(), took '+' out
int len = strlen(buf);
// fprintf(flog, "buf: '%s', len: %d\n", buf, len); fflush(flog);
text[0] = 0;
for (int i=0; i<len; i++)
{
int len = strlen(text);
if (strchr(url, buf[i]))
snprintf(&text[len], sz-len, "%c", buf[i]);
else
snprintf(&text[len], sz-len, "%%%02x", (unsigned char)buf[i]);
// fprintf(flog, "%d\n", i); fflush(flog);
}
// strcpy(buf, text);
// Log(text, "Returning:");
return text;
}
/*
char * urlencode(const char * buf)
{
return urlencode( buf, text, sizeof(text) );
}
*/
char * urldecode( char * buf, char * text, int sz)
{
// Log(buf, "urldecode()");
unsigned int c3;
char * c2; c2 = buf;
unsigned int ch;
char * value=text;
// int valuelen = sz;
value[0] = 0;
//bool EOS = false;
while (c2)
{
c3 = strcspn(c2, "%+"); // "%+"
if (c3==strlen(c2))
{
// strncpy_(&value[strlen(value)], c2, Min0(c3, valuelen-strlen(value)-1, EOS) );
strsafecat( value, c2, sz );
break; //over
}
// strncpy_(&value[strlen(value)], c2, Min0(c3, valuelen-strlen(value)-1, EOS) );
strnsafecat( value, c2, c3, sz );
// Log(value);
// if (EOS) break;
// '+' is actually an allowed symbol per http://www.rfc-editor.org/rfc/rfc1738.txt
// but browser rules say space is encoded as '+'
// http://www.speakeasy.org/~cgires/readdata/
if (*(c2+c3)=='+')
{
// strncpy_(&value[strlen(value)], " ", Min0(1, valuelen-strlen(value)-1, EOS) );
strsafecat( value, " ", sz );
// if (EOS) break;
c2+=c3+1;
}
else
{
sscanf(c2+c3+1, "%2x", &ch);
strcatf( value, sz, "%c", ch);
// if (strlen(value)>=valuelen-1)
// { EOS = TRUE; break; }
c2+=c3+3;
}
}
value[sz-1] = 0;
// Log(text, "urldecode returning");
return text;
}