RetroArch/tools/retrolaunch/parser.c
2013-01-11 11:51:52 +01:00

76 lines
1.0 KiB
C

#include "parser.h"
#include <errno.h>
#include <string.h>
#include <stdlib.h>
ssize_t get_token(int fd, char *token, size_t max_len)
{
char *c = token;
int rv;
ssize_t len = 0;
int in_string = 0;
while (1) {
rv = read(fd, c, 1);
if (rv == 0) {
return 0;
} else if (rv < 1) {
switch (errno) {
case EINTR:
case EAGAIN:
continue;
default:
return -errno;
}
}
switch (*c) {
case ' ':
case '\t':
case '\r':
case '\n':
if (c == token) {
continue;
}
if (!in_string) {
*c = '\0';
return len;
}
break;
case '\"':
if (c == token) {
in_string = 1;
continue;
}
*c = '\0';
return len;
}
len++;
c++;
if (len == (ssize_t)max_len) {
*c = '\0';
return len;
}
}
}
int find_token(int fd, const char *token)
{
int tmp_len = strlen(token);
char *tmp_token = (char*)calloc(tmp_len, 1);
if (!tmp_token) {
return -1;
}
while (strncmp(tmp_token, token, tmp_len) != 0) {
if (get_token(fd, tmp_token, tmp_len) <= 0) {
return -1;
}
}
return 0;
}