/********************************************************************* * Determines format of input file and calls parse_word_header or * process_file if * it is word processor file or copy_out if it is plain text file * return not 0 when error ********************************************************************/ int analyze_format(FILE *f) { unsigned char buffer[129]; long offset=0; FILE *new_file, *ole_file; int ret_code=69; if (!signature_check) { /* forced parsing */ /* no autodetect possible. Assume 8-bit if not overriden on * command line */ if (!get_unicode_char) get_unicode_char=get_8bit_char; return process_file(f,LONG_MAX); } if (catdoc_read(buffer,4,1,f) <= 0) return -1; buffer[4]=0; if (strncmp(buffer,write_sign,2)==0) { printf("[Windows Write file. Some garbage expected]\n"); get_unicode_char=get_8bit_char; return process_file(f,LONG_MAX); } else if (strncmp(buffer,rtf_sign,4)==0) { return parse_rtf(f); } else if (strncmp(buffer,old_word_sign,2)==0) { fread(buffer+4,1,124,f); return parse_word_header(buffer,f,128,0); } fread(buffer+4,1,4,f); if (strncmp(buffer,ole_sign,8)==0) { if ((new_file=ole_init(f, buffer, 8)) != NULL) { set_ole_func(); while((ole_file=ole_readdir(new_file)) != NULL) { int res=ole_open(ole_file); if (res >= 0) { if (strcmp(((oleEntry*)ole_file)->name , "WordDocument") == 0) { offset=catdoc_read(buffer, 1, 128, ole_file); ret_code=parse_word_header(buffer,ole_file,-offset,offset); } } ole_close(ole_file); } set_std_func(); ole_finish(); } else { fprintf(stderr,"Broken OLE file. Try using -b switch"); exit(1); } } else { set_std_func(); copy_out(f,buffer); return 0; } return ret_code; }
/** * * * @param argc * @param argv * * @return */ int main(int argc, char *argv[]) { FILE *input; FILE *new_file, *ole_file; char *filename =NULL; short int *tmp_charset; int c; int i; char *tempname; read_config_file(SYSTEMRC); #ifdef USERRC tempname=find_file(strdup(USERRC),getenv("HOME")); if (tempname) { read_config_file(tempname); free(tempname); } #endif #ifdef HAVE_LANGINFO get_locale_charset(); #endif check_charset(&dest_csname,dest_csname); while ((c=getopt(argc,argv,"Vls:d:p:"))!=-1) { switch(c) { case 'l': list_charsets(); exit(0); case 's': check_charset(&source_csname,optarg); source_charset=read_charset(source_csname); break; case 'd': check_charset(&dest_csname,optarg); break; case 'V': printf("Catdoc Version %s\n",CATDOC_VERSION); exit(0); default: help(); exit(1); } } /* If we are using system strftime, we need to set LC_TIME locale * category unless choosen charset is not same as system locale */ #if defined(HAVE_LANGINFO) && defined(HAVE_STRFTIME) && !defined(__TURB0C__) set_time_locale(); #endif /* charset conversion init*/ input_buffer=malloc(FILE_BUFFER); if (strcmp(dest_csname,"utf-8")) { tmp_charset=read_charset(dest_csname); if (!tmp_charset) { fprintf(stderr,"Cannot load target charset %s\n",dest_csname); exit(1); } target_charset=make_reverse_map(tmp_charset); free(tmp_charset); } else { target_charset=NULL; } spec_chars=read_substmap(stradd("ascii",SPEC_EXT)); if (!spec_chars) { fprintf(stderr,"Cannod read substitution map ascii%s\n", SPEC_EXT); exit(1); } replacements=read_substmap(stradd("ascii",REPL_EXT)); if (!replacements) { fprintf(stderr,"Cannod read substitution map ascii%s\n", REPL_EXT); exit(1); } if (optind>=argc) { if (isatty(fileno(stdin))) { help(); exit(0); } do_ppt(stdin,"STDIN"); exit (0); } for (i=optind;i<argc;i++) { filename = argv[i]; input=fopen(filename,"rb"); if (!input) { perror(filename); exit(1); } if ((new_file=ole_init(input, NULL, 0)) != NULL) { set_ole_func(); while((ole_file=ole_readdir(new_file)) != NULL) { int res=ole_open(ole_file); /* fprintf(stderr, "name = %s\n", ((oleEntry*)ole_file)->name); */ if (res >= 0) { if (strcasecmp(((oleEntry*)ole_file)->name , "PowerPoint Document") == 0) { do_ppt(ole_file,filename); } } ole_close(ole_file); } set_std_func(); ole_finish(); fclose(new_file); } else { fprintf(stderr, "%s is not OLE file or Error\n", filename); } } return 0; }