--- psiconv/trunk/program/psiconv/psiconv.c 2003/11/25 17:57:05 168 +++ psiconv/trunk/program/psiconv/psiconv.c 2004/02/23 13:08:32 219 @@ -1,6 +1,6 @@ /* psiconv.c - Part of psiconv, a PSION 5 file formats converter - Copyright (c) 1999 Frodo Looijaard + Copyright (c) 1999-2004 Frodo Looijaard This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -17,22 +17,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ -/* - 2002/Apr. Keita KAWABE - * Support for narrow build Asian Psions added. - - Now psiconv understands -u or --UTF8 option. - This option is passed to output_function as the fourth parameter - (thus the typedef of output_function was changed). - - If a called generator (gen_*.c) can handle UTF8, then it handles - the character conversion etc. accordingly. - - * psiconv seemed to want to take the argument of the options - case-insensitively (i.e. LaTeX -> LATEX), but that was not working - under my environment. Fixed it. -*/ - /* Driver program */ #include "config.h" @@ -42,6 +26,7 @@ #include #include #include +#include #include #ifdef HAVE_UNISTD_H @@ -52,11 +37,12 @@ #include "magick-aux.h" #endif -#include "psiconv/data.h" -#include "psiconv/parse.h" -#include "psiconv/configuration.h" -#include "gen.h" +#include +#include +#include +#include #include "psiconv.h" +#include "gen.h" static void print_help(void); static void print_version(void); @@ -64,27 +50,56 @@ void print_help(void) { - psiconv_fileformat ff; + fileformat ff; int i,j; puts("Syntax: psiconv [OPTIONS..] [FILE]"); - puts("Convert the psion Word file FILE to other formats"); + puts("Convert the psion file FILE to other formats"); puts("If FILE is not specified, use stdin"); - puts(" -d, --debug Show debug information on stderr"); - puts(" -h, --help Display this help and exit"); - puts(" -o, --outputfile Output to file instead of stdout"); - puts(" -s, --silent Do not even show warnings on stderr"); - puts(" -T, --type=FILETYPE Output type"); - puts(" -V, --version Display the program version and exit"); - puts(" -v, --verbose Show progress indicators on stderr"); - puts(" -u, --UTF8 Input file is encoded in UTF8"); + puts(" -c, --configfile=FILE Read extra configuration file after normal ones"); + puts(" -e, --encoding=ENC Output encoding (default: UTF8)"); + puts(" -h, --help Display this help and exit"); + puts(" -n, --noise=LEVEL Select what to print on stderr (overrides psiconv.conf)"); + puts(" -o, --outputfile Output to file instead of stdout"); + puts(" -T, --type=FILETYPE Output type (default: XHTML or TIFF"); + puts(" -V, --version Display the program version and exit"); + puts(""); + puts("The following encodings are currently supported:"); + puts(" UTF8 Variable length Unicode encoding"); + puts(" UCS2 Fixed 16-bit length Unicode encoding"); + puts(" Psion The encoding your Psion uses (as in psiconv.conf)"); + puts(" ASCII 7-bit ASCII (other symbols are substituted by '?')"); + puts(""); + puts("The following noise levels are currently supported:"); + puts(" 1 or F: Fatal errors only"); + puts(" 2 or E: Errors"); + puts(" 3 or W: Warnings"); + puts(" 4 or P: Progress indicators"); + puts(" 5 or D: Debug data"); + puts(""); + puts("The following abbreviations are used in the output types list:"); + puts(" C - processes ClipArt files"); + puts(" c - processes ClipArt files containing only one image"); + puts(" M - processes MBM files"); + puts(" m - processes MBM files containing only one image"); + puts(" S - processes Sketch files"); + puts(" T - processes TextEd files"); + puts(" W - processes Word files"); puts(""); puts("The following output types are known:"); for (i = 0; i < psiconv_list_length(fileformat_list); i ++) { ff = psiconv_list_get(fileformat_list,i); printf(" %s",ff->name); - for (j = strlen(ff->name); j < 15; j++) + for (j = strlen(ff->name); j < 10; j++) putchar(' '); + printf("[%c%c%c%c%c] ", + ff->supported_format & FORMAT_CLIPART_MULTIPLE?'C': + ff->supported_format & FORMAT_CLIPART_SINGLE?'c':' ', + ff->supported_format & FORMAT_MBM_MULTIPLE?'M': + ff->supported_format & FORMAT_MBM_SINGLE?'m':' ', + ff->supported_format & FORMAT_SKETCH?'S':' ', + ff->supported_format & FORMAT_TEXTED?'T':' ', + ff->supported_format & FORMAT_WORD?'W':' '); puts(ff->description); } puts(""); @@ -110,37 +125,39 @@ { {"help",no_argument,NULL,'h'}, {"version",no_argument,NULL,'V'}, - {"verbose",no_argument,NULL,'v'}, - {"debug",no_argument,NULL,'d'}, - {"silent",no_argument,NULL,'s'}, + {"configfile",required_argument,NULL,'c'}, + {"noise",required_argument,NULL,'n'}, {"outputfile",required_argument,NULL,'o'}, {"type",required_argument,NULL,'T'}, - {"UTF8",no_argument,NULL,'u'}, + {"encoding",no_argument,NULL,'e'}, {0,0,0,0} }; - const char* short_options = "hVvsdo:uT:"; + const char* short_options = "hVn:o:e:T:c:"; int option_index; FILE * f; struct stat fbuf; const char *inputfilename = ""; const char *outputfilename = ""; - char *type = strdup("HTML3"); - psiconv_encoding encoding_type=PSICONV_ENCODING_CP1252; + const char *extra_configfile = NULL; + char *type = NULL; + encoding encoding_type=ENCODING_UTF8; + psiconv_list outputlist; + int verbosity = 0; int c,i,res; psiconv_buffer buf; psiconv_file file; - psiconv_fileformat ff; + fileformat ff = NULL; - psiconv_config config = psiconv_config_read(NULL); + if (!(fileformat_list = psiconv_list_new(sizeof(struct fileformat_s)))) { + fputs("Out of memory error",stderr); + exit(1); + } - fileformat_list = psiconv_list_new(sizeof(struct psiconv_fileformat_s)); init_txt(); - init_html(); + init_xhtml(); init_html4(); - init_latex(); - init_rtf(); init_image(); while(1) { @@ -150,14 +167,44 @@ switch(c) { case 'h': print_help(); exit(0); case 'V': print_version(); exit(0); - case 'v': if (config->verbosity < PSICONV_VERB_PROGRESS) - config->verbosity = PSICONV_VERB_PROGRESS; + case 'n': switch(optarg[0]) { + case '1': case 'F':case 'f': + verbosity=PSICONV_VERB_FATAL; + break; + case '2': case 'E':case 'e': + verbosity=PSICONV_VERB_ERROR; + break; + case '3': case 'W':case 'w': + verbosity=PSICONV_VERB_WARN; + break; + case '4': case 'P':case 'p': + verbosity=PSICONV_VERB_PROGRESS; + break; + case '5': case 'D':case 'd': + verbosity=PSICONV_VERB_DEBUG; + break; + default: + fputs("Unknown noise level\n",stderr); + exit(1); + } break; - case 'd': config->verbosity = PSICONV_VERB_DEBUG; break; - case 's': config->verbosity = PSICONV_VERB_FATAL; break; case 'o': outputfilename = strdup(optarg); break; case 'T': type = strdup(optarg); break; - case 'u': encoding_type = PSICONV_ENCODING_UTF8; break; + case 'e': if(!strcmp(optarg,"UTF8")) + encoding_type = ENCODING_UTF8; + else if (!strcmp(optarg,"UCS2")) + encoding_type = ENCODING_UCS2; + else if (!strcmp(optarg,"ASCII")) + encoding_type = ENCODING_ASCII; + else if (!strcmp(optarg,"Psion")) + encoding_type = ENCODING_PSION; + else { + fputs("Unknown encoding type " + "(try '-h' for more information\n",stderr); + exit(1); + } + break; + case 'c': extra_configfile = strdup(optarg); break; case '?': case ':': fputs("Try `-h' for more information\n",stderr); exit(1); default: fprintf(stderr,"Internal error: getopt_long returned character " @@ -170,8 +217,15 @@ "Try `-h' for more information\n",stderr); exit(1); } else if (optind == argc-1) - inputfilename = strdup(argv[optind]); + if (!(inputfilename = strdup(argv[optind]))) { + fputs("Out of memory error",stderr); + exit(1); + } + psiconv_config config = psiconv_config_default(); + psiconv_config_read(extra_configfile,&config); + if (verbosity) + config->verbosity = verbosity; /* Open inputfile for reading */ @@ -188,8 +242,14 @@ } else f = stdin; - buf = psiconv_buffer_new(); - psiconv_buffer_fread_all(buf,f); + if (!(buf = psiconv_buffer_new())) { + fputs("Out of memory error",stderr); + exit(1); + } + if (psiconv_buffer_fread_all(buf,f)) { + fprintf(stderr,"Failure reading file"); + exit(1); + } if (strlen(inputfilename) != 0) if (fclose(f)) { @@ -203,20 +263,23 @@ exit(1); } - /* Set correct output file */ - if (strlen(outputfilename) == 0) - outputfilename = "/dev/stdout"; + if (!type) { + switch(file->type) { + case psiconv_word_file: + case psiconv_texted_file: + default: + type = "XHTML"; break; + case psiconv_mbm_file: + case psiconv_clipart_file: + case psiconv_sketch_file: + type = "TIFF"; break; + } + } else + strtoupper(type); - strtoupper(type); for (i = 0; i < psiconv_list_length(fileformat_list); i ++) { ff = psiconv_list_get(fileformat_list,i); if (! strcasecmp(type,ff->name)) { - res = ff->output(outputfilename,file,type, encoding_type); - if (res) { - fprintf(stderr, - "Output format `%s' not permitted for this file type\n",type); - exit(1); - } break; } } @@ -226,7 +289,37 @@ exit(1); } + if (!(outputlist = psiconv_list_new(sizeof(psiconv_u8)))) { + fputs("Out of memory error\n",stderr); + exit(1); + } + + res = ff->output(config,outputlist,file,type,encoding_type); + if (res) { + fprintf(stderr, + "Output format `%s' not permitted for this file type\n",type); + exit(1); + } + psiconv_free_file(file); + if (strlen(outputfilename) != 0) { + f = fopen(outputfilename,"w"); + if (! f) { + perror(inputfilename); + exit(1); + } + } else + f = stdout; + + psiconv_list_fwrite_all(outputlist,f); + + if (fclose(f)) { + perror(inputfilename); + exit(1); + } + + psiconv_list_free(outputlist); + exit(0); }