static void _parse_message(IdleParser *parser, const gchar *split_msg) {
	gchar **tokens = _tokenize(split_msg);
	IDLE_DEBUG("parsing \"%s\"", split_msg);

	for (int i = 0; i < IDLE_PARSER_LAST_MESSAGE_CODE; i++) {
		const MessageSpec *spec = &(message_specs[i]);

		if ((split_msg[0] != ':') && (i <= IDLE_PARSER_LAST_NON_PREFIX_CMD)) {
			if (!g_ascii_strcasecmp(tokens[0], spec->str))
				_parse_and_forward_one(parser, tokens, spec->code, spec->format);
		} else if (i > IDLE_PARSER_LAST_NON_PREFIX_CMD) {
			if (!g_ascii_strcasecmp(tokens[2], spec->str))
				_parse_and_forward_one(parser, tokens, spec->code, spec->format);
		}
	}

	_free_tokens(tokens);
}
예제 #2
0
/*
 * Tokenize
 */
struct scfg_token_queue *
scfg_tokenize(const char *filename)
{
    struct scfg_token_queue *tq;
    FILE *fp;
    char *s;
    off_t n;
    int errno_saved;

    /* Open the file */
    fp = fopen(filename, "r");
    if ( NULL == fp ) {
        /* Cannot open the file */
        return NULL;
    }
    /* Get file size */
    (void)fseeko(fp, 0L, SEEK_END);
    n = ftello(fp);
    (void)fseeko(fp, 0L, SEEK_SET);

    /* Allocate */
    s = malloc(sizeof(char) * (n + 1));
    if ( NULL == s ) {
        errno_saved = errno;
        fclose(fp);
        errno = errno_saved;
        return NULL;
    }
    fread(s, sizeof(char), n, fp);
    s[n] = '\0';

    /* Close the file */
    (void)fclose(fp);

    tq = _tokenize(s);
    errno_saved = errno;
    free(s);
    if ( NULL == tq ) {
        errno = errno_saved;
        return NULL;
    }

    return tq;
}