blob: 7ec7dad4e9d35ad35499d5f165cb5b03e906145d [file] [log] [blame]
/* Copyright (c) 2011 The Chromium OS Authors. All rights reserved.
* Use of this source code is governed by a BSD-style license that can be
* found in the LICENSE file.
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <eprintf.h>
#include <style.h>
/*
* Given a file, read a token at a time.
* Not thread safe.
*/
enum { MAX_TOKEN = 1024 };
static FILE *Fp;
static char *Delim;
static char Token[MAX_TOKEN];
static int Delimiter;
void close_token (void)
{
if (Fp) fclose(Fp);
Fp = NULL;
if (Delim) free(Delim);
Delim = NULL;
}
void open_token (char *file, char *delim)
{
if (Fp) fatal("Token in use");;
Fp = fopen(file, "r");
if (!Fp) fatal("couldn't open %s", file);
Delim = strdup(delim);
if (!Delim) fatal("couldn't duplicate %s", delim);
}
static inline bool is_delim (int c)
{
char *d;
for (d = Delim; *d; d++) {
if (c == *d) return TRUE;
}
return FALSE;
}
char *get_token (void)
{
int c;
char *next = Token;
char *end = &Token[MAX_TOKEN - 1];
while (next < end) {
c = getc(Fp);
if (c == EOF) break;
if (is_delim(c)) {
if (next == Token) continue;
break;
}
*next++ = c;
}
if (next == Token) return NULL;
*next = '\0';
Delimiter = c;
return Token;
}
int get_delimiter (void)
{
return Delimiter;
}