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); }
/* * 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; }