/********************************************************************* * 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); } catdoc_read(buffer,4,1,f); buffer[4]=0; if (strncmp((char *)&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((char *)&buffer,rtf_sign,4)==0) { return parse_rtf(f); } else if (strncmp((char *)&buffer, zip_sign,4) == 0) { fprintf(stderr,"This file looks like ZIP archive or Office 2007 " "or later file.\nNot supported by catdoc\n"); exit(1); } else if (strncmp((char *)&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((char *)&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\n"); exit(1); } } else { copy_out(f,(char *)&buffer); return 0; } return ret_code; }
/********************************************************************* * Determines format of input file and calls parse_word_header or * m_pReader->process_file if * it is word processor file or copy_out if it is plain text file * return not 0 when error ********************************************************************/ int Analyze::parseDOC(FILE *f) { unsigned char buffer[129]; long offset=0; FILE *new_file, *ole_file; int ret_code=69; if (!GlobalConf.signature_check) { /* forced parsing */ /* no autodetect possible. Assume 8-bit if not overriden on * command line */ if (!getCharGetter()) setCharGetter(CHAR_8BIT); return m_pReader->process_file(f,LONG_MAX); } m_pOleFile->ole_read(buffer,4,1,f); buffer[4]=0; if (strncmp((const char*)buffer,(const char*)write_sign,2)==0) { printf("[Windows Write file. Some garbage expected]\n"); setCharGetter(CHAR_8BIT); return m_pReader->process_file(f,LONG_MAX); } else if (strncmp((const char*)buffer,(const char*)rtf_sign,4)==0) { return m_pRTFRead->parse_rtf(f); } else if (strncmp((const char*)buffer,(const char*)old_word_sign,2)==0) { size_t readLen = fread(buffer+4,1,124,f); (void)readLen; return parse_word_header(buffer,f,128,0); } size_t readLen = fread(buffer+4,1,4,f); (void)readLen; if (strncmp((const char*)buffer,(const char*)ole_sign,8)==0) { if ((new_file=m_pOleFile->ole_init(f, buffer, 8)) != NULL) { m_pOleFile->set_ole_func(); while((ole_file=m_pOleFile->ole_readdir(new_file)) != NULL) { int res=m_pOleFile->ole_open(ole_file); if (res >= 0) { if (strcmp(((oleEntry*)ole_file)->name , "WordDocument") == 0) { offset=m_pOleFile->ole_read(buffer, 1, 128, ole_file); ret_code=parse_word_header(buffer,ole_file,-offset,offset); } } m_pOleFile->ole_close(ole_file); } m_pOleFile->set_std_func(); m_pOleFile->ole_finish(); } else { fprintf(stderr,"Broken OLE file. Try using -b switch"); exit(1); } } else { m_pOleFile->set_std_func(); m_pReader->copy_out(f,(char*)buffer); return 0; } return ret_code; }