--- psiconv/trunk/lib/psiconv/parse_formula.c 2001/02/03 15:11:31 106 +++ psiconv/trunk/lib/psiconv/parse_formula.c 2002/01/29 18:38:38 142 @@ -25,6 +25,11 @@ #include "parse_routines.h" #include "error.h" +#ifdef DMALLOC +#include +#endif + + struct formula_element { psiconv_formula_type_t formula_type; @@ -48,11 +53,11 @@ {psiconv_formula_op_pow,2,"^"}, {psiconv_formula_op_pos,1,"+"}, {psiconv_formula_op_neg,1,"-"}, - {psiconv_formula_unknown,0,"*UNKNOWN*"}, - {psiconv_formula_unknown,0,"*UNKNOWN*"}, - {psiconv_formula_unknown,0,"*UNKNOWN*"}, /* 10 */ + {psiconv_formula_op_not,1,"NOT"}, + {psiconv_formula_op_and,2,"AND"}, + {psiconv_formula_op_or,2,"OR"}, /* 10 */ {psiconv_formula_op_con,2,"&"}, - {psiconv_formula_op_bra,1,"{}"}, + {psiconv_formula_op_bra,1,"()"}, {psiconv_formula_unknown,0,"*UNKNOWN*"}, {psiconv_formula_unknown,0,"*UNKNOWN*"}, {psiconv_formula_mark_eof,0,"End of formula"}, @@ -286,67 +291,8 @@ {psiconv_formula_unknown,0,"*UNKNOWN*"}, {psiconv_formula_unknown,0,"*UNKNOWN*"}, {psiconv_formula_unknown,0,"*UNKNOWN*"}, - {psiconv_formula_unknown,0,"*UNKNOWN*"}, - {psiconv_formula_unknown,0,"*UNKNOWN*"}, - {psiconv_formula_unknown,0,"*UNKNOWN*"}, {psiconv_formula_unknown,0,"*UNKNOWN*"}}; -static psiconv_string_t psiconv_read_sheet_string(const psiconv_buffer buf, - int lev, - psiconv_u32 off,int *length, int *status) -{ - int stringlen,i,len,localstatus; - psiconv_string_t result; - char *res_copy; - - psiconv_progress(lev+1,off,"Going to read a sheet string"); - - stringlen = psiconv_read_u8(buf,lev+2,off,&localstatus); - if (localstatus) - goto ERROR1; - psiconv_debug(lev+2,off,"Length: %i",stringlen); - len = 1; - - result = malloc(stringlen + 1); - if (!result) - goto ERROR1; - for (i = 0; (i < stringlen) && !localstatus; i++) - result[i] = psiconv_read_u8(buf,lev,off+i+len,&localstatus); - if (localstatus) - goto ERROR2; - result[stringlen] = 0; - len += stringlen; - - res_copy = psiconv_make_printable(result); - if (!res_copy) - goto ERROR2; - psiconv_debug(lev+2,off,"Contents: `%s'",res_copy); - free(res_copy); - - if (length) - *length = len; - - if (status) - *status = 0; - - psiconv_progress(lev+1,off+len-1,"End of sheet string (total length: %08x)", - len); - - return result; - - -ERROR2: - free(result); -ERROR1: - psiconv_warn(lev+1,off,"Reading of sheet string failed"); - if (status) - *status = localstatus; - if (length) - *length = 0; - return NULL; -} - - static int psiconv_parse_sheet_ref(const psiconv_buffer buf,int lev, psiconv_u32 off, int *length, psiconv_sheet_ref_t *result) @@ -449,7 +395,7 @@ int len=0; int leng; int eof = 0; - psiconv_u8 marker,submarker; + psiconv_u8 marker,submarker,submarker2; psiconv_formula_list formula_stack; psiconv_formula formula,subformula,subformula1,subformula2, subformula3,subformula4; @@ -551,7 +497,7 @@ psiconv_formula_dat_string) { psiconv_progress(lev+3,off+len,"Next item: a string"); formula->data.dat_string = - psiconv_read_sheet_string(buf,lev+2,off+len,&leng,&res); + psiconv_read_short_string(buf,lev+2,off+len,&leng,&res); if (res) goto ERROR8; formula->type = formula_elements[marker].formula_type; @@ -560,11 +506,16 @@ goto ERROR8; formula->type = psiconv_formula_unknown; } else if ((formula_elements[marker].formula_type == - psiconv_formula_dat_var) || - (formula_elements[marker].formula_type == - psiconv_formula_dat_vcellblock)) { - psiconv_warn(lev+3,off+len,"Not yet supported formula mark!"); - goto ERROR8; + psiconv_formula_dat_var)) { + psiconv_progress(lev+3,off+len,"Next item: a variable reference"); + formula->data.dat_variable = psiconv_read_u32(buf,lev+2,off+len,&res); + if (res) + goto ERROR8; + formula->type = formula_elements[marker].formula_type; + len += 4; + if ((res = psiconv_list_add(formula_stack,formula))) + goto ERROR8; + formula->type = psiconv_formula_unknown; } else if (formula_elements[marker].number_of_args == -1) { psiconv_progress(lev+3,off+len,"Going to parse a vararg function"); if (!(formula->data.fun_operands = @@ -590,8 +541,20 @@ len ++; if (res) goto ERROR8; - } while (formula_elements[submarker].formula_type - == psiconv_formula_mark_opsep); + submarker2 = psiconv_read_u8(buf,lev+4,off+len,&res); + if (res) + goto ERROR8; + } while ((formula_elements[submarker].formula_type + == psiconv_formula_mark_opsep) && + (formula_elements[submarker2].formula_type + != psiconv_formula_mark_opend)); + if ((formula_elements[submarker].formula_type == + psiconv_formula_mark_opsep) && + (formula_elements[submarker2].formula_type == + psiconv_formula_mark_opend)) { + submarker=submarker2; + len++; + } if (formula_elements[submarker].formula_type != psiconv_formula_mark_opend) { psiconv_warn(lev+3,off+len,"Formula corrupted!");