mirror of
https://github.com/libretro/RetroArch.git
synced 2024-11-28 02:30:35 +00:00
81 lines
1.4 KiB
C
81 lines
1.4 KiB
C
#include "db_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;
|
|
}
|