--- psiconv/trunk/lib/psiconv/parse_formula.c 2001/02/02 21:07:11 105 +++ psiconv/trunk/lib/psiconv/parse_formula.c 2001/02/03 15:11:31 106 @@ -449,9 +449,11 @@ int len=0; int leng; int eof = 0; - psiconv_u8 marker; + psiconv_u8 marker,submarker; psiconv_formula_list formula_stack; - psiconv_formula formula,subformula1,subformula2,subformula3,subformula4; + psiconv_formula formula,subformula,subformula1,subformula2, + subformula3,subformula4; + psiconv_u16 temp,nr_of_subs; psiconv_progress(lev+1,off,"Going to read a formula element list"); if (!(*result = malloc(sizeof(**result)))) @@ -532,8 +534,10 @@ if ((res = psiconv_list_add(formula_stack,formula))) goto ERROR8; formula->type = psiconv_formula_unknown; - } else if (formula_elements[marker].formula_type == - psiconv_formula_dat_cellblock) { + } else if ((formula_elements[marker].formula_type == + psiconv_formula_dat_cellblock) || + (formula_elements[marker].formula_type == + psiconv_formula_dat_vcellblock)) { psiconv_progress(lev+3,off+len,"Next item: a cell block"); if ((res = psiconv_parse_sheet_cell_block(buf,lev+2,off+len,&leng, &formula->data.dat_cellblock))) @@ -562,8 +566,67 @@ psiconv_warn(lev+3,off+len,"Not yet supported formula mark!"); goto ERROR8; } else if (formula_elements[marker].number_of_args == -1) { - psiconv_warn(lev+3,off+len,"Vararg functions not yet supported!"); - goto ERROR8; + psiconv_progress(lev+3,off+len,"Going to parse a vararg function"); + if (!(formula->data.fun_operands = + psiconv_list_new(sizeof(*formula)))) + goto ERROR8; + formula->type = formula_elements[marker].formula_type; + nr_of_subs = 0; + do { + nr_of_subs ++; + psiconv_progress(lev+4,off+len,"Going to read vararg argument %d", + nr_of_subs); + if ((res = psiconv_parse_formula_element_list(buf,lev+4,off+len,&leng, + &subformula,maxlen))) + goto ERROR8; + len += leng; + if ((res = psiconv_list_add(formula->data.fun_operands,subformula))) { + psiconv_free_formula(subformula); + goto ERROR8; + } + free(subformula); + psiconv_progress(lev+4,off+len,"Going to read the next marker"); + submarker = psiconv_read_u8(buf,lev+4,off+len,&res); + len ++; + if (res) + goto ERROR8; + } while (formula_elements[submarker].formula_type + == psiconv_formula_mark_opsep); + if (formula_elements[submarker].formula_type + != psiconv_formula_mark_opend) { + psiconv_warn(lev+3,off+len,"Formula corrupted!"); + psiconv_debug(lev+3,off+len,"Found unexpected marker %02x",submarker); + goto ERROR8; + } + psiconv_progress(lev+3,off+len,"Going to read the repeated marker %02x", + marker); + submarker = psiconv_read_u8(buf,lev+3,off+len,&res); + if (res) + goto ERROR8; + if (submarker != marker) { + psiconv_warn(lev+3,off+len,"Formula corrupted!"); + psiconv_debug(lev+3,off+len,"Expected marker %02x, found %02x", + marker,submarker); + goto ERROR8; + } + len++; + psiconv_progress(lev+3,off+len, + "Going to read the number of arguments (%d expected)", + nr_of_subs); + temp = psiconv_read_u16(buf,lev+3,off+len,&res); + if (res) + goto ERROR8; + if (temp != nr_of_subs) { + psiconv_warn(lev+3,off+len,"Formula corrupted!"); + psiconv_debug(lev+3,off+len, + "Read %d arguments, but formula says there are %d", + nr_of_subs,temp); + goto ERROR8; + } + len += 2; + if ((res = psiconv_list_add(formula_stack,formula))) + goto ERROR8; + formula->type = psiconv_formula_unknown; } else { if (formula_elements[marker].number_of_args > 0) if ((res = psiconv_list_pop(formula_stack,subformula1)))