./ MultiCS.r82 / parser.c
#include "common.h"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <unistd.h>
#include <stdint.h>
#ifdef WIN32
#include <windows.h>
#else
#include <fcntl.h>
#include <sys/time.h>
#include <time.h>
#include <pthread.h>
#include <sys/socket.h>
#include <unistd.h>
#include <netdb.h>
#include <netinet/in.h>
#include <netinet/ip.h>
#include <netinet/tcp.h>
#include <errno.h>
#endif
#include "parser.h"
char *uppercase(char *str)
{
int i;
for(i=0;;i++) {
switch(str[i]) {
case 'a'...'z':
str[i] = str[i] - ('a'-'A');
break;
case 0:
return str;
}
}
}
///////////////////////////////////////////////////////////////////////////////
// PARSER FUNCTIONS
///////////////////////////////////////////////////////////////////////////////
char *iparser; // Current Parser Index
//Skip Spaces
void parse_spaces()
{
while ( (*iparser==' ')||(*iparser=='\t') ) iparser++;
}
int charpos( char c, char *str )
{
int i;
int l = strlen(str);
for(i=0; i<l; i++) if (c==str[i]) return i+1;
return 0;
}
int parse_value(char *str, char *delimiters)
{
int len;
char *end;
parse_spaces();
end=iparser;
while ( !charpos(*end,delimiters) && (*end!=0) ) end++;
if ( (len=end-iparser)>0 ) {
if (len>=255) len=255; // check for length
memcpy(str, iparser, len);
iparser = end;
}
str[len] = 0;
return len;
}
int parse_str(char *str)
{
int len;
char *end;
parse_spaces();
end=iparser;
while ( (*end!=0)&&(*end!=' ')&&(*end!='\t')&&(*end!=13)&&(*end!=10) ) end++;
if ( (len=end-iparser)>0 ) {
if (len>=255) len=255; // check for length
memcpy(str, iparser, len);
iparser = end;
}
str[len] = 0;
return len;
}
int parse_name(char *str)
{
int len;
char *end;
parse_spaces();
end=iparser;
while ( (*end!=0)&&(*end!=' ')&&(*end!='\t')&&(*end!=13)&&(*end!=10)&&(*end!=']')&&(*end!=':') ) end++;
if ( (len=end-iparser)>0 ) {
if (len>=255) len=255; // check for length
memcpy(str, iparser, len);
iparser = end;
}
str[len] = 0;
return len;
}
int parse_boolean()
{
char str[255];
parse_value(str,"\r\n\t;,:]= ");
if (!strcmp(str,"1")) return 1;
else if (!strcmp(str,"0")) return 0;
else {
uppercase(str);
if (!strcmp(str,"NO")) return 0;
else if (!strcmp(str,"YES")) return 1;
else if (!strcmp(str,"OFF")) return 0;
else if (!strcmp(str,"ON")) return 1;
}
return 0; // Error
}
int parse_int(char *str)
{
int len;
char *end;
parse_spaces();
end=iparser;
while ( (*end>='0')&&(*end<='9') ) end++;
if ( (len=end-iparser)>0 ) {
if (len>=255) len=255; // check for length
memcpy(str, iparser, len);
iparser = end;
}
str[len] = 0;
return len;
}
int parse_hex(char *str)
{
int len;
char *end;
parse_spaces();
end=iparser;
while ( ((*end>='0')&&(*end<='9'))||((*end>='A')&&(*end<='F'))||((*end>='a')&&(*end<='f')) ) end++;
if ( (len=end-iparser)>0 ) {
if (len>=255) len=255; // check for length
memcpy(str, iparser, len);
iparser = end;
}
str[len] = 0;
return len;
}
int parse_bin(char *str)
{
int len;
char *end;
parse_spaces();
end=iparser;
while ( (*end=='0')||(*end=='1') ) end++;
if ( (len=end-iparser)>0 ) {
if (len>=255) len=255; // check for length
memcpy(str, iparser, len);
iparser = end;
}
str[len] = 0;
return len;
}
int parse_expect( char c )
{
parse_spaces();
if (*iparser==c) {
iparser++;
return 1;
}
else return 0;
}
int parse_quotes( char quote, char *str )
{
str[0] = 0;
parse_spaces();
if (*iparser==quote) {
iparser++;
char *start = iparser;
while ( (*iparser!=quote)&&(*iparser!='\n')&&(*iparser!='\r')&&(*iparser!=0) ) iparser++;
if (*iparser==quote) {
if (iparser-start) {
*iparser = 0;
strcpy( str, start );
*iparser = quote;
iparser++;
}
return 1;
}
}
return 0;
}