parser_example.c
A simple example of using the
FAXPP_Parser API to parse a document.
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <string.h>
#include <sys/time.h>
#include <faxpp/parser.h>
#include "entity_resolver.h"
#include "output_event.h"
#define BUFFER_SIZE 10
#define MSECS_IN_SECS 1000000
unsigned long getTime()
{
struct timeval timev;
gettimeofday(&timev, 0);
return (timev.tv_sec * MSECS_IN_SECS) + timev.tv_usec;
}
int
main(int argc, char **argv)
{
FAXPP_Error err;
int i;
unsigned long startTime;
FILE *file;
if(argc < 2) {
printf("Too few arguments\n");
exit(-1);
}
FAXPP_Parser *parser = FAXPP_create_parser(WELL_FORMED_PARSE_MODE, FAXPP_utf8_transcoder);
if(parser == 0) {
printf("ERROR: out of memory\n");
exit(1);
}
for(i = 1; i < argc; ++i) {
FAXPP_set_external_entity_callback(parser, entity_callback, 0);
startTime = getTime();
file = fopen(argv[i], "r");
if(file == 0) {
printf("Open of '%s' failed: %s\n", argv[i], strerror(errno));
exit(1);
}
err = FAXPP_init_parse_callback(parser, file_read_callback, file);
if(err == NO_ERROR)
err = FAXPP_set_base_uri_str(parser, argv[i]);
if(err != NO_ERROR) {
printf("ERROR: %s\n", FAXPP_err_to_string(err));
exit(1);
}
while((err = FAXPP_next_event(parser)) == 0) {
output_event(FAXPP_get_current_event(parser), stdout);
if(FAXPP_get_current_event(parser)->type == END_DOCUMENT_EVENT)
break;
}
if(err != NO_ERROR) {
output_text(FAXPP_get_base_uri(parser), stdout);
printf(":%d:%d ERROR: %s\n", FAXPP_get_error_line(parser),
FAXPP_get_error_column(parser), FAXPP_err_to_string(err));
}
printf("Time taken: %gms\n", ((double)(getTime() - startTime) / MSECS_IN_SECS * 1000));
}
FAXPP_free_parser(parser);
return 0;
}