109a3aaf3SDag-Erling Smørgrav /* 209a3aaf3SDag-Erling Smørgrav * parse.h 309a3aaf3SDag-Erling Smørgrav * 409a3aaf3SDag-Erling Smørgrav * a Net::DNS like library for C 509a3aaf3SDag-Erling Smørgrav * LibDNS Team @ NLnet Labs 609a3aaf3SDag-Erling Smørgrav * (c) NLnet Labs, 2005-2006 709a3aaf3SDag-Erling Smørgrav * See the file LICENSE for the license 809a3aaf3SDag-Erling Smørgrav */ 909a3aaf3SDag-Erling Smørgrav 1009a3aaf3SDag-Erling Smørgrav #ifndef LDNS_PARSE_H 1109a3aaf3SDag-Erling Smørgrav #define LDNS_PARSE_H 1209a3aaf3SDag-Erling Smørgrav 1309a3aaf3SDag-Erling Smørgrav struct sldns_buffer; 1409a3aaf3SDag-Erling Smørgrav 1509a3aaf3SDag-Erling Smørgrav #ifdef __cplusplus 1609a3aaf3SDag-Erling Smørgrav extern "C" { 1709a3aaf3SDag-Erling Smørgrav #endif 1809a3aaf3SDag-Erling Smørgrav 1909a3aaf3SDag-Erling Smørgrav #define LDNS_PARSE_SKIP_SPACE "\f\n\r\v" 2009a3aaf3SDag-Erling Smørgrav #define LDNS_PARSE_NORMAL " \f\n\r\t\v" 2109a3aaf3SDag-Erling Smørgrav #define LDNS_PARSE_NO_NL " \t" 2209a3aaf3SDag-Erling Smørgrav #define LDNS_MAX_LINELEN 10230 2309a3aaf3SDag-Erling Smørgrav #define LDNS_MAX_KEYWORDLEN 32 2409a3aaf3SDag-Erling Smørgrav 2509a3aaf3SDag-Erling Smørgrav 2609a3aaf3SDag-Erling Smørgrav /** 2709a3aaf3SDag-Erling Smørgrav * \file 2809a3aaf3SDag-Erling Smørgrav * 2909a3aaf3SDag-Erling Smørgrav * Contains some low-level parsing functions, mostly used in the _frm_str 3009a3aaf3SDag-Erling Smørgrav * family of functions. 3109a3aaf3SDag-Erling Smørgrav */ 3209a3aaf3SDag-Erling Smørgrav 3309a3aaf3SDag-Erling Smørgrav /** 3409a3aaf3SDag-Erling Smørgrav * different type of directives in zone files 3509a3aaf3SDag-Erling Smørgrav * We now deal with $TTL, $ORIGIN and $INCLUDE. 3609a3aaf3SDag-Erling Smørgrav * The latter is not implemented in ldns (yet) 3709a3aaf3SDag-Erling Smørgrav */ 3809a3aaf3SDag-Erling Smørgrav enum sldns_enum_directive 3909a3aaf3SDag-Erling Smørgrav { 4009a3aaf3SDag-Erling Smørgrav LDNS_DIR_TTL, 4109a3aaf3SDag-Erling Smørgrav LDNS_DIR_ORIGIN, 4209a3aaf3SDag-Erling Smørgrav LDNS_DIR_INCLUDE 4309a3aaf3SDag-Erling Smørgrav }; 4409a3aaf3SDag-Erling Smørgrav typedef enum sldns_enum_directive sldns_directive; 4509a3aaf3SDag-Erling Smørgrav 4609a3aaf3SDag-Erling Smørgrav /** 4709a3aaf3SDag-Erling Smørgrav * returns a token/char from the stream F. 4809a3aaf3SDag-Erling Smørgrav * This function deals with ( and ) in the stream, 4909a3aaf3SDag-Erling Smørgrav * and ignores them when encountered 5009a3aaf3SDag-Erling Smørgrav * \param[in] *f the file to read from 5109a3aaf3SDag-Erling Smørgrav * \param[out] *token the read token is put here 5209a3aaf3SDag-Erling Smørgrav * \param[in] *delim chars at which the parsing should stop 5309a3aaf3SDag-Erling Smørgrav * \param[in] *limit how much to read. If 0 the builtin maximum is used 5409a3aaf3SDag-Erling Smørgrav * \return 0 on error of EOF of the stream F. Otherwise return the length of what is read 5509a3aaf3SDag-Erling Smørgrav */ 5609a3aaf3SDag-Erling Smørgrav ssize_t sldns_fget_token(FILE *f, char *token, const char *delim, size_t limit); 5709a3aaf3SDag-Erling Smørgrav 5809a3aaf3SDag-Erling Smørgrav /** 5909a3aaf3SDag-Erling Smørgrav * returns a token/char from the stream F. 6009a3aaf3SDag-Erling Smørgrav * This function deals with ( and ) in the stream, 6109a3aaf3SDag-Erling Smørgrav * and ignores when it finds them. 6209a3aaf3SDag-Erling Smørgrav * \param[in] *f the file to read from 6309a3aaf3SDag-Erling Smørgrav * \param[out] *token the token is put here 6409a3aaf3SDag-Erling Smørgrav * \param[in] *delim chars at which the parsing should stop 6509a3aaf3SDag-Erling Smørgrav * \param[in] *limit how much to read. If 0 use builtin maximum 6609a3aaf3SDag-Erling Smørgrav * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) 6709a3aaf3SDag-Erling Smørgrav * \return 0 on error of EOF of F otherwise return the length of what is read 6809a3aaf3SDag-Erling Smørgrav */ 6909a3aaf3SDag-Erling Smørgrav ssize_t sldns_fget_token_l(FILE *f, char *token, const char *delim, size_t limit, int *line_nr); 7009a3aaf3SDag-Erling Smørgrav 7109a3aaf3SDag-Erling Smørgrav /** 7209a3aaf3SDag-Erling Smørgrav * returns a token/char from the buffer b. 7309a3aaf3SDag-Erling Smørgrav * This function deals with ( and ) in the buffer, 7409a3aaf3SDag-Erling Smørgrav * and ignores when it finds them. 7509a3aaf3SDag-Erling Smørgrav * \param[in] *b the buffer to read from 7609a3aaf3SDag-Erling Smørgrav * \param[out] *token the token is put here 7709a3aaf3SDag-Erling Smørgrav * \param[in] *delim chars at which the parsing should stop 7809a3aaf3SDag-Erling Smørgrav * \param[in] *limit how much to read. If 0 the builtin maximum is used 7909a3aaf3SDag-Erling Smørgrav * \param[in] *par if you pass nonNULL, set to 0 on first call, the parenthesis 8009a3aaf3SDag-Erling Smørgrav * state is stored in it, for use on next call. User must check it is back 8109a3aaf3SDag-Erling Smørgrav * to zero after last bget in string (for parse error). If you pass NULL, 8209a3aaf3SDag-Erling Smørgrav * the entire parenthesized string is read in. 8309a3aaf3SDag-Erling Smørgrav * \param[in] skipw string with whitespace to skip before the start of the 8409a3aaf3SDag-Erling Smørgrav * token, like " ", or " \t", or NULL for none. 8509a3aaf3SDag-Erling Smørgrav * \returns 0 on error of EOF of b. Otherwise return the length of what is read 8609a3aaf3SDag-Erling Smørgrav */ 8709a3aaf3SDag-Erling Smørgrav ssize_t sldns_bget_token_par(struct sldns_buffer *b, char *token, const char *delim, size_t limit, int* par, const char* skipw); 8809a3aaf3SDag-Erling Smørgrav 8909a3aaf3SDag-Erling Smørgrav /** 9009a3aaf3SDag-Erling Smørgrav * returns a token/char from the buffer b. 9109a3aaf3SDag-Erling Smørgrav * This function deals with ( and ) in the buffer, 9209a3aaf3SDag-Erling Smørgrav * and ignores when it finds them. 9309a3aaf3SDag-Erling Smørgrav * \param[in] *b the buffer to read from 9409a3aaf3SDag-Erling Smørgrav * \param[out] *token the token is put here 9509a3aaf3SDag-Erling Smørgrav * \param[in] *delim chars at which the parsing should stop 9609a3aaf3SDag-Erling Smørgrav * \param[in] *limit how much to read. If 0 the builtin maximum is used 9709a3aaf3SDag-Erling Smørgrav * \returns 0 on error of EOF of b. Otherwise return the length of what is read 9809a3aaf3SDag-Erling Smørgrav */ 9909a3aaf3SDag-Erling Smørgrav ssize_t sldns_bget_token(struct sldns_buffer *b, char *token, const char *delim, size_t limit); 10009a3aaf3SDag-Erling Smørgrav 10109a3aaf3SDag-Erling Smørgrav /* 10209a3aaf3SDag-Erling Smørgrav * searches for keyword and delim in a file. Gives everything back 10309a3aaf3SDag-Erling Smørgrav * after the keyword + k_del until we hit d_del 10409a3aaf3SDag-Erling Smørgrav * \param[in] f file pointer to read from 10509a3aaf3SDag-Erling Smørgrav * \param[in] keyword keyword to look for 1068a384985SDag-Erling Smørgrav * \param[in] k_del keyword delimiter 10709a3aaf3SDag-Erling Smørgrav * \param[out] data the data found 1088a384985SDag-Erling Smørgrav * \param[in] d_del the data delimiter 109*56850988SCy Schubert * \param[in] data_limit maximum size the data buffer 11009a3aaf3SDag-Erling Smørgrav * \return the number of character read 11109a3aaf3SDag-Erling Smørgrav */ 11209a3aaf3SDag-Erling Smørgrav ssize_t sldns_fget_keyword_data(FILE *f, const char *keyword, const char *k_del, char *data, const char *d_del, size_t data_limit); 11309a3aaf3SDag-Erling Smørgrav 11409a3aaf3SDag-Erling Smørgrav /* 11509a3aaf3SDag-Erling Smørgrav * searches for keyword and delim. Gives everything back 11609a3aaf3SDag-Erling Smørgrav * after the keyword + k_del until we hit d_del 11709a3aaf3SDag-Erling Smørgrav * \param[in] f file pointer to read from 11809a3aaf3SDag-Erling Smørgrav * \param[in] keyword keyword to look for 1198a384985SDag-Erling Smørgrav * \param[in] k_del keyword delimiter 12009a3aaf3SDag-Erling Smørgrav * \param[out] data the data found 1218a384985SDag-Erling Smørgrav * \param[in] d_del the data delimiter 122*56850988SCy Schubert * \param[in] data_limit maximum size the data buffer 12309a3aaf3SDag-Erling Smørgrav * \param[in] line_nr pointer to an integer containing the current line number (for 12409a3aaf3SDag-Erling Smørgrav debugging purposes) 12509a3aaf3SDag-Erling Smørgrav * \return the number of character read 12609a3aaf3SDag-Erling Smørgrav */ 12709a3aaf3SDag-Erling Smørgrav ssize_t sldns_fget_keyword_data_l(FILE *f, const char *keyword, const char *k_del, char *data, const char *d_del, size_t data_limit, int *line_nr); 12809a3aaf3SDag-Erling Smørgrav 12909a3aaf3SDag-Erling Smørgrav /* 13009a3aaf3SDag-Erling Smørgrav * searches for keyword and delim in a buffer. Gives everything back 13109a3aaf3SDag-Erling Smørgrav * after the keyword + k_del until we hit d_del 13209a3aaf3SDag-Erling Smørgrav * \param[in] b buffer pointer to read from 13309a3aaf3SDag-Erling Smørgrav * \param[in] keyword keyword to look for 1348a384985SDag-Erling Smørgrav * \param[in] k_del keyword delimiter 13509a3aaf3SDag-Erling Smørgrav * \param[out] data the data found 1368a384985SDag-Erling Smørgrav * \param[in] d_del the data delimiter 137*56850988SCy Schubert * \param[in] data_limit maximum size the data buffer 13809a3aaf3SDag-Erling Smørgrav * \return the number of character read 13909a3aaf3SDag-Erling Smørgrav */ 14009a3aaf3SDag-Erling Smørgrav ssize_t sldns_bget_keyword_data(struct sldns_buffer *b, const char *keyword, const char *k_del, char *data, const char *d_del, size_t data_limit); 14109a3aaf3SDag-Erling Smørgrav 14209a3aaf3SDag-Erling Smørgrav /** 14309a3aaf3SDag-Erling Smørgrav * returns the next character from a buffer. Advances the position pointer with 1. 14409a3aaf3SDag-Erling Smørgrav * When end of buffer is reached returns EOF. This is the buffer's equivalent 14509a3aaf3SDag-Erling Smørgrav * for getc(). 14609a3aaf3SDag-Erling Smørgrav * \param[in] *buffer buffer to read from 14709a3aaf3SDag-Erling Smørgrav * \return EOF on failure otherwise return the character 14809a3aaf3SDag-Erling Smørgrav */ 14909a3aaf3SDag-Erling Smørgrav int sldns_bgetc(struct sldns_buffer *buffer); 15009a3aaf3SDag-Erling Smørgrav 15109a3aaf3SDag-Erling Smørgrav /** 15209a3aaf3SDag-Erling Smørgrav * skips all of the characters in the given string in the buffer, moving 15309a3aaf3SDag-Erling Smørgrav * the position to the first character that is not in *s. 15409a3aaf3SDag-Erling Smørgrav * \param[in] *buffer buffer to use 15509a3aaf3SDag-Erling Smørgrav * \param[in] *s characters to skip 15609a3aaf3SDag-Erling Smørgrav */ 15709a3aaf3SDag-Erling Smørgrav void sldns_bskipcs(struct sldns_buffer *buffer, const char *s); 15809a3aaf3SDag-Erling Smørgrav 15909a3aaf3SDag-Erling Smørgrav /** 16009a3aaf3SDag-Erling Smørgrav * skips all of the characters in the given string in the fp, moving 16109a3aaf3SDag-Erling Smørgrav * the position to the first character that is not in *s. 16209a3aaf3SDag-Erling Smørgrav * \param[in] *fp file to use 16309a3aaf3SDag-Erling Smørgrav * \param[in] *s characters to skip 16409a3aaf3SDag-Erling Smørgrav */ 16509a3aaf3SDag-Erling Smørgrav void sldns_fskipcs(FILE *fp, const char *s); 16609a3aaf3SDag-Erling Smørgrav 16709a3aaf3SDag-Erling Smørgrav 16809a3aaf3SDag-Erling Smørgrav /** 16909a3aaf3SDag-Erling Smørgrav * skips all of the characters in the given string in the fp, moving 17009a3aaf3SDag-Erling Smørgrav * the position to the first character that is not in *s. 17109a3aaf3SDag-Erling Smørgrav * \param[in] *fp file to use 17209a3aaf3SDag-Erling Smørgrav * \param[in] *s characters to skip 17309a3aaf3SDag-Erling Smørgrav * \param[in] line_nr pointer to an integer containing the current line number (for debugging purposes) 17409a3aaf3SDag-Erling Smørgrav */ 17509a3aaf3SDag-Erling Smørgrav void sldns_fskipcs_l(FILE *fp, const char *s, int *line_nr); 17609a3aaf3SDag-Erling Smørgrav 17709a3aaf3SDag-Erling Smørgrav #ifdef __cplusplus 17809a3aaf3SDag-Erling Smørgrav } 17909a3aaf3SDag-Erling Smørgrav #endif 18009a3aaf3SDag-Erling Smørgrav 18109a3aaf3SDag-Erling Smørgrav #endif /* LDNS_PARSE_H */ 182