示例#1
0
文件: analyze.c 项目: daftano/catdoc
/********************************************************************* 
 * 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;
}   
示例#2
0
/********************************************************************* 
 * 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;
}