# Bazaar merge directive format 2 (Bazaar 0.90) # revision_id: address@hidden # target_branch: file:///home/davazp/projects/gnupdf/trunk/ # testament_sha1: e6faad00fc6d6a437ddeb9e33bb873289ee572dd # timestamp: 2009-02-24 19:04:33 +0100 # base_revision_id: address@hidden # # Begin patch === modified file 'AUTHORS' --- AUTHORS 2009-01-14 20:59:55 +0000 +++ AUTHORS 2009-02-03 18:11:29 +0000 @@ -232,23 +232,31 @@ Zac Brown: changed doc/gnupdf.texi src/base/pdf-fsys-disk.c David Vazquez: wrote /torture/unit/base/crypt/ - /torture/unit/base/crypt/pdf-crypt-cipher-decrypt.c - /torture/unit/base/crypt/pdf-crypt-cipher-decrypt-size.c - /torture/unit/base/crypt/pdf-crypt-cipher-destroy.c - /torture/unit/base/crypt/pdf-crypt-cipher-encrypt.c - /torture/unit/base/crypt/pdf-crypt-cipher-encrypt-size.c - /torture/unit/base/crypt/pdf-crypt-cipher-new.c - /torture/unit/base/crypt/pdf-crypt-cipher-setkey.c - /torture/unit/base/crypt/pdf-crypt-init.c - /torture/unit/base/crypt/pdf-crypt-md-md5.c - /torture/unit/base/crypt/tsuite-crypt.c - /src/base/pdf-crypt.c - /src/base/pdf-crypt-c-aesv2.c - /src/base/pdf-crypt-c-aesv2.h - /src/base/pdf-crypt-c-v2.c - /src/base/pdf-crypt-c-v2.h - /src/base/pdf-crypt.h + torture/unit/base/crypt/pdf-crypt-cipher-decrypt.c + torture/unit/base/crypt/pdf-crypt-cipher-decrypt-size.c + torture/unit/base/crypt/pdf-crypt-cipher-destroy.c + torture/unit/base/crypt/pdf-crypt-cipher-encrypt.c + torture/unit/base/crypt/pdf-crypt-cipher-encrypt-size.c + torture/unit/base/crypt/pdf-crypt-cipher-new.c + torture/unit/base/crypt/pdf-crypt-cipher-setkey.c + torture/unit/base/crypt/pdf-crypt-init.c + torture/unit/base/crypt/pdf-crypt-md-md5.c + torture/unit/base/crypt/tsuite-crypt.c + src/base/pdf-crypt.c + src/base/pdf-crypt-c-aesv2.c + src/base/pdf-crypt-c-aesv2.h + src/base/pdf-crypt-c-v2.c + src/base/pdf-crypt-c-v2.h + src/base/pdf-crypt.h + src/base/pdf-stm-f-aesv2.c + src/base/pdf-stm-f-aesv2.h + src/base/pdf-stm-f-md5.c + src/base/pdf-stm-f-md5.h + src/base/pdf-stm-f-v2.c + src/base/pdf-stm-f-v2.h and changed doc/gnupdf.texi + torture/unit/base/stm/pdf-stm-read.c + torture/unit/base/stm/pdf-stm-write.c Michael Gold: changed src/Makefile.am utils/Makefile.am torture/unit/Makefile.am === modified file 'ChangeLog' --- ChangeLog 2009-02-22 18:21:26 +0000 +++ ChangeLog 2009-02-24 18:04:06 +0000 @@ -1,3 +1,9 @@ +2009-02-24 David Vazquez + + * doc/gnupdf.texi (Evaluation of Functions): Section updated. + + * torture/unit/base/fp/pdf-fp-func-eval.c: Negative tests added. + 2009-02-22 Jose E. Marchesi * doc/gnupdf.texi (Big Numbers): Clarify that a 64bits value can @@ -28,6 +34,21 @@ * doc/gnupdf-arch.texi (Tokeniser module): New section. +2009-02-08 David Vazquez + + * src/base/pdf-fp-func.c (pdf_fp_func_4_new): Fix checking of + balanced braces wrongly, and manages others errors. + + * src/base/pdf-error.h (PDF_ERROR_LIST): Errors for type 4 + functions added. + +2009-02-07 David Vazquez + + * torture/unit/base/fp/pdf-fp-func-4-new.c: New file + + * src/base/pdf-fp-func.c (pdf_fp_func_4_new): New arguments for + error management. + 2009-02-06 Jose E. Marchesi * src/base/pdf-stm.c (pdf_stm_flush): Return PDF_EEOF if it was === modified file 'doc/gnupdf.texi' --- doc/gnupdf.texi 2009-02-22 18:21:26 +0000 +++ doc/gnupdf.texi 2009-02-24 18:04:06 +0000 @@ -5232,7 +5232,7 @@ @end table @end deftypefun address@hidden pdf_status_t pdf_fp_func_4_new (pdf_u32_t @var{m}, pdf_u32_t @var{n}, pdf_real_t @var{domain}[], pdf_real_t @var{range}[], pdf_char_t address@hidden, pdf_size_t @var{code_size}, pdf_fp_func_t address@hidden) address@hidden pdf_status_t pdf_fp_func_4_new (pdf_u32_t @var{m}, pdf_u32_t @var{n}, pdf_real_t @var{domain}[], pdf_real_t @var{range}[], pdf_char_t address@hidden, pdf_size_t @var{code_size}, pdf_size_t address@hidden, pdf_fp_func_t address@hidden) Create a new type 4 (postscript calculator) function. @@ -5254,6 +5254,8 @@ Memory buffer containing the postscript code to execute. @item code_size Size of @var{code}. address@hidden error_at +Pointer to a variable where it will put the current offset on error. @item function Pointer to a variable holding the new function. @end table @@ -5325,7 +5327,7 @@ @end table @end deftypefun address@hidden pdf_status_t pdf_fp_func_eval (pdf_fp_func_t @var{function}, const pdf_real_t @var{in}[], pdf_real_t @var{out}[]) address@hidden pdf_status_t pdf_fp_func_eval (pdf_fp_func_t @var{function}, const pdf_real_t @var{in}[], pdf_real_t @var{out}[], pdf_fp_func_debug_t address@hidden) Evaluate a function. @@ -5338,6 +5340,8 @@ Array containing the input values for the function. @item out Array containing the output values from the function evaluation. address@hidden debug +A pointer to the structure will contain debug information. @end table @item Returns A PDF status value: === modified file 'src/base/pdf-error.h' --- src/base/pdf-error.h 2009-01-14 20:39:58 +0000 +++ src/base/pdf-error.h 2009-02-20 19:04:32 +0000 @@ -1,4 +1,4 @@ -/* -*- mode: C -*- Time-stamp: "09/01/13 22:06:33 jemarch" +/* -*- mode: C -*- Time-stamp: "2009-02-16 22:15:40 davazp" * * File: pdf-error.h * Date: Sun Feb 24 20:22:05 2008 @@ -87,13 +87,24 @@ ERROR_ENTRY (PDF_EEXIST, "already exists"), \ ERROR_ENTRY (PDF_EOPENED, "file is opened"), \ ERROR_ENTRY (PDF_ECLOSED, "file is closed"), \ - ERROR_ENTRY (PDF_EOVERFLOW, "/FunctionType 0: Sample Table too large"), \ + ERROR_ENTRY (PDF_EOVERFLOW, "Input is too large"), \ + ERROR_ENTRY (PDF_EUNDERFLOW, "Input is too small"), \ ERROR_ENTRY (PDF_EMTOOBIG, "/FunctionType 0: input dim too high (<= 12)"), \ ERROR_ENTRY (PDF_EBADSAMPLES, "/FunctionType 0: error while reading sample table"), \ ERROR_ENTRY (PDF_EBADAESKEY, "the size of an AES key should be a multiple of 16"), \ ERROR_ENTRY (PDF_EBADV2KEY, "a V2 key should be at least 40 bits long"), \ - ERROR_ENTRY (PDF_EINVOP, "invalid operation") - + ERROR_ENTRY (PDF_EINVOP, "invalid operation"), \ + ERROR_ENTRY (PDF_EBADOP, "/FunctionType 4: Unknown operator"), \ + ERROR_ENTRY (PDF_EMISSBODY, "/FunctionType 4: Missing body conditional"), \ + ERROR_ENTRY (PDF_ENOWRAP, "/FunctionType 4: Code should be wrapped by braces"), \ + ERROR_ENTRY (PDF_ETOODEPTH, "/FunctionType 4: Exceeded the max depth level"), \ + ERROR_ENTRY (PDF_EMISSIF, "/FunctionType 4: Missing if/ifelse operator"), \ + ERROR_ENTRY (PDF_EBADTYPE, "/FunctionType 4: Bad type"), \ + ERROR_ENTRY (PDF_EMATH, "/FunctionType 4: Math error"), \ + ERROR_ENTRY (PDF_ETYPE0, "/FunctionType 0: Error"), \ + ERROR_ENTRY (PDF_ETYPE2, "/FunctionType 2: Error"), \ + ERROR_ENTRY (PDF_ETYPE3, "/FunctionType 3: Error"), \ + ERROR_ENTRY (PDF_ETYPE4, "/FunctionType 4: Error") #define ERROR_ENTRY(id,string) id enum pdf_status_e === modified file 'src/base/pdf-fp-func.c' --- src/base/pdf-fp-func.c 2009-01-03 22:17:53 +0000 +++ src/base/pdf-fp-func.c 2009-02-24 17:53:55 +0000 @@ -1,4 +1,4 @@ -/* -*- mode: C -*- Time-stamp: "09/01/03 21:29:32 jemarch" +/* -*- mode: C -*- Time-stamp: "2009-02-24 18:52:09 davazp" * * File: pdf-fp-func.c * Date: Sun Nov 30 18:46:06 2008 @@ -42,26 +42,38 @@ static pdf_i32_t get_token (pdf_char_t *buf, pdf_size_t buf_size, - pdf_size_t *cur_pos, + pdf_size_t start, + pdf_size_t *bot, + pdf_size_t *eot, double *literal); static inline void setmap (double map[2], const pdf_real_t to[2], const pdf_real_t from[2]); + static pdf_status_t pdf_eval_spline (pdf_fp_func_t fun, const pdf_real_t t[], - pdf_real_t out[]); + pdf_real_t out[], + pdf_fp_func_debug_t * debug); + static pdf_status_t pdf_eval_linear (pdf_fp_func_t fun, const pdf_real_t t[], - pdf_real_t out[]); + pdf_real_t out[], + pdf_fp_func_debug_t * debug); + static pdf_status_t pdf_eval_exponential (pdf_fp_func_t t, const pdf_real_t in[], - pdf_real_t out[]); + pdf_real_t out[], + pdf_fp_func_debug_t * debug); + static pdf_status_t pdf_eval_stitch (pdf_fp_func_t t, const pdf_real_t in[], - pdf_real_t out[]); + pdf_real_t out[], + pdf_fp_func_debug_t * debug); + static pdf_status_t pdf_eval_type4(pdf_fp_func_t t, const pdf_real_t in[], - pdf_real_t out[]); + pdf_real_t out[], + pdf_fp_func_debug_t * debug); typedef enum { @@ -366,24 +378,35 @@ return ret; } -pdf_status_t pdf_fp_func_4_new (pdf_u32_t m, - pdf_u32_t n, - pdf_real_t domain[], - pdf_real_t range[], - pdf_char_t *code, - pdf_size_t code_size, - pdf_fp_func_t *function) +#define BRACES_MAX_LEVEL 32 + +pdf_status_t +pdf_fp_func_4_new (pdf_u32_t m, + pdf_u32_t n, + pdf_real_t domain[], + pdf_real_t range[], + pdf_char_t *code, + pdf_size_t code_size, + pdf_size_t *error_at, + pdf_fp_func_t *function) { pdf_fp_func_t f; - pdf_u32_t off[32]; + pdf_u32_t off[BRACES_MAX_LEVEL]; + pdf_u32_t braces_pos[BRACES_MAX_LEVEL]; pdf_char_t *op; pdf_i32_t at; pdf_i32_t to; pdf_i32_t alloc; pdf_i32_t bsp; + pdf_i32_t blevel; /* braces level depth */ double lit; pdf_i32_t opc; + pdf_size_t beg_pos; /* beginning of current token */ pdf_size_t cur_pos; + pdf_status_t ret; + pdf_u32_t (*debug_off)[2]; + pdf_size_t debug_size; + pdf_size_t debug_alloc; /* Common data */ f = pdf_alloc (sizeof(struct pdf_fp_func_s)); @@ -395,20 +418,28 @@ /* Specific data */ cur_pos = 0; + beg_pos = 0; alloc = 64; op = pdf_alloc (alloc); - opc = get_token (code, code_size, &cur_pos, &lit); + debug_alloc = 64; + debug_size = 0; + debug_off = pdf_alloc (sizeof(*debug_off) * debug_alloc); + + opc = get_token (code, code_size, cur_pos, &beg_pos, &cur_pos, &lit); if (opc != OPC_begin) { + ret = PDF_ENOWRAP; goto fail; } + blevel = 1; bsp = 0; at = 0; for(;;) { - if (bsp >= sizeof(off)/sizeof(off[0])) + if (bsp >= BRACES_MAX_LEVEL) { + ret = PDF_ETOODEPTH; goto fail; } @@ -417,15 +448,29 @@ alloc *= 2; op = pdf_realloc (op,alloc); } - opc = get_token (code, code_size, &cur_pos, &lit); + + if (debug_size >= debug_alloc) + { + debug_alloc *= 2; + debug_off = pdf_realloc (debug_off, sizeof(*debug_off) * debug_alloc); + } + + + beg_pos = cur_pos; + opc = get_token (code, code_size, cur_pos, &beg_pos, &cur_pos, &lit); if (opc < 0) { + ret = PDF_EEOF; goto fail; } switch ((PDF_TYPE4_OPC)opc) { case OPC_lit: { + debug_off[debug_size][0] = at; + debug_off[debug_size][1] = beg_pos; + debug_size++; + op[at++] = opc; memcpy (op+at, &lit, sizeof(lit)); at += sizeof (lit); @@ -433,26 +478,56 @@ } case OPC_begin: { - off[bsp++] = at; /* backpatched by if/ifelse */ + blevel++; + off[bsp] = at; /* backpatched by if/ifelse */ + braces_pos[bsp] = beg_pos; + bsp++; + + debug_off[debug_size][0] = at; + debug_off[debug_size][1] = beg_pos; + debug_size++; + op[at] = OPC_begin; /* OPC_error */ at += 1+sizeof(at); + break; } case OPC_end: { - if (bsp) + blevel--; + + if (blevel) { - off[bsp++] = at; + off[bsp] = at; + braces_pos[bsp] = beg_pos; + bsp++; } else { void *r; + + debug_off[debug_size][0] = at; + debug_off[debug_size][1] = beg_pos; + debug_size++; + op[at++] = OPC_ret; - if (get_token (code, code_size, &cur_pos, &lit) >= 0) - { - goto fail; - } + + if (get_token (code, code_size, cur_pos, &beg_pos, &cur_pos, &lit) >= 0) + { + ret = PDF_ENOWRAP; + goto fail; + } + + if (bsp) + { + beg_pos = braces_pos[--bsp]; /* reporting error offset */ + ret = PDF_EMISSIF; + goto fail; + } + /* memory is transferred to f, not freed here */ + debug_off = pdf_realloc (debug_off, sizeof(*debug_off) * debug_alloc); + r = pdf_realloc (op,at); if (r) { @@ -461,6 +536,9 @@ f->u.t4.opcodes = op; f->u.t4.n_opcodes = at; + f->u.t4.debug_off = debug_off; + f->u.t4.debug_size = debug_size; + f->eval = pdf_eval_type4; goto success; @@ -471,9 +549,15 @@ { if (bsp < 2 || at != off[--bsp]) { + ret = PDF_EMISSBODY; goto fail; } - op[off[--bsp]] = OPC_jnt; + + debug_off[debug_size][0] = --bsp; + debug_off[debug_size][1] = beg_pos; + debug_size++; + + op[off[bsp]] = OPC_jnt; to = at - 1; memcpy(op+1+off[bsp],&to,sizeof(to)); break; @@ -482,16 +566,22 @@ { if (bsp < 4 || at != off[--bsp]) { + ret = PDF_EMISSBODY; goto fail; } - op[off[--bsp]] = OPC_jmp; + debug_off[debug_size][0] = --bsp; + debug_off[debug_size][1] = beg_pos; + debug_size++; + + op[off[bsp]] = OPC_jmp; to = at-1; memcpy(op+off[bsp]+1,&to,sizeof(to)); to = off[bsp--]; if (to != off[bsp--]) { + ret = PDF_EMISSBODY; goto fail; } to += sizeof(to); @@ -501,12 +591,16 @@ } case OPC_bad: { - /* stream offset would be nice */ + ret = PDF_EBADOP; goto fail; break; } default: { + debug_off[debug_size][0] = at; + debug_off[debug_size][1] = beg_pos; + debug_size++; + op[at++] = opc; break; } @@ -516,8 +610,13 @@ fail: pdf_dealloc (op); - return PDF_ERROR; - + pdf_dealloc (debug_off); + + if (error_at != NULL) + { + *error_at = beg_pos; + } + return ret; success: *function = f; @@ -527,9 +626,10 @@ pdf_status_t pdf_fp_func_eval (pdf_fp_func_t function, const pdf_real_t in[], - pdf_real_t out[]) + pdf_real_t out[], + pdf_fp_func_debug_t * result) { - return function->eval(function, in, out); + return function->eval(function, in, out, result); } pdf_status_t @@ -593,6 +693,7 @@ break; case 4: pdf_dealloc (t->u.t4.opcodes); + pdf_dealloc (t->u.t4.debug_off); break; } @@ -968,7 +1069,8 @@ static pdf_status_t pdf_eval_linear (pdf_fp_func_t fun, const pdf_real_t in[], - pdf_real_t out[]) + pdf_real_t out[], + pdf_fp_func_debug_t * debug) { pdf_u32_t i,j; double t; @@ -1051,7 +1153,8 @@ static pdf_status_t pdf_eval_spline (pdf_fp_func_t fun, const pdf_real_t in[], - pdf_real_t out[]) + pdf_real_t out[], + pdf_fp_func_debug_t * debug) { pdf_u32_t i,j; double t,v; @@ -1142,7 +1245,8 @@ static pdf_status_t pdf_eval_exponential (pdf_fp_func_t t, const pdf_real_t in[], - pdf_real_t out[]) + pdf_real_t out[], + pdf_fp_func_debug_t * debug) { pdf_u32_t j; pdf_real_t x,y; @@ -1169,7 +1273,8 @@ static pdf_status_t pdf_eval_stitch (pdf_fp_func_t t, const pdf_real_t in[], - pdf_real_t out[]) + pdf_real_t out[], + pdf_fp_func_debug_t * debug) { pdf_fp_func_t f; pdf_real_t x; @@ -1223,7 +1328,7 @@ f = t->u.t3.functions[i]; - return f->eval(f,&x,out); + return f->eval(f,&x,out, debug); } /* ------- decoder utilities ------ */ @@ -1291,7 +1396,7 @@ /* --- ------------------------------- --- */ -#define NSTACK 100 +#define NSTACK PDF_FP_FUNC_TYPE4_STACK_SIZE #define REP_TRUE (1.202056903159594285399738162) #define REP_FALSE (-15116315767.09215686274509804) #define INT(xyyzy) ((int) pdf_fp_floor (xyyzy)) @@ -1302,7 +1407,8 @@ static pdf_status_t pdf_eval_type4 (pdf_fp_func_t t, const pdf_real_t in[], - pdf_real_t out[]) + pdf_real_t out[], + pdf_fp_func_debug_t * debug) { double stack[NSTACK+2]; pdf_char_t *op; @@ -1310,7 +1416,9 @@ double tmp; pdf_i32_t sp; pdf_i32_t pc; - + pdf_fp_func_debug_t debug_info; + pdf_i32_t aux; + op = t->u.t4.opcodes; n = t->u.t4.n_opcodes; @@ -1334,7 +1442,7 @@ } out[sp] = clip(stack[sp], t->range + 2*sp); } - return 0; + return PDF_OK; break; case OPC_lit: if (sp >= NSTACK) goto stack_overflow; @@ -1392,14 +1500,17 @@ break; case OPC_log: if (sp < 0) goto stack_underflow; + if (stack[sp] < 0) goto range_error; stack[sp] = pdf_fp_log10 (stack[sp]); break; case OPC_ln: if (sp < 0) goto stack_underflow; + if (stack[sp] < 0) goto range_error; stack[sp] = pdf_fp_log (stack[sp]); break; case OPC_sqrt: if (sp < 0) goto stack_underflow; + if (stack[sp] < 0) goto range_error; stack[sp] = pdf_fp_sqrt (stack[sp]); break; case OPC_floor: @@ -1495,6 +1606,7 @@ break; case OPC_div: if (sp < 1) goto stack_underflow; + if (stack[sp] == 0) goto math_error; stack[sp-1] /= stack[sp]; sp--; break; @@ -1618,16 +1730,43 @@ } } - block_error : return -1; - stack_underflow: printf("STACK UNDEFLOW\n"); return -1; - stack_overflow : printf("STACK OVERFLOW\n"); return -1; - stack_error : return -1; - range_error : return -1; - type_error : return -1; - math_error : return -1; + + block_error: + return PDF_ERROR; + + stack_error: + return PDF_EINVRANGE; + + stack_underflow: debug_info.type4.status = PDF_EUNDERFLOW; goto end; + stack_overflow: debug_info.type4.status = PDF_EOVERFLOW; goto end; + range_error: debug_info.type4.status = PDF_EINVRANGE; goto end; + type_error: debug_info.type4.status = PDF_EBADTYPE; goto end; + math_error: debug_info.type4.status = PDF_EMATH; goto end; + end: + + /* Found that code was compiled to the opcode for debugging. */ + debug_info.type4.op = -1; + for (aux = 0; aux < t->u.t4.debug_size; aux++) + { + if (t->u.t4.debug_off[aux][0] == pc) + { + debug_info.type4.op = t->u.t4.debug_off[aux][1]; + break; + } + } + + /* Copy some elements from the stack for debugging */ + for (aux = 0; aux <= sp; aux++) + { + debug_info.type4.stack[aux] = stack[sp - aux]; + } + debug_info.type4.stack_size = sp + 1; + + if (debug != NULL) + *debug = debug_info; + + return PDF_ETYPE4; } - - /* ANSI-C code produced by gperf version 3.0.1 */ /* Command-line: gperf -t -m 100 pdf_function_type4.gperf */ /* Computed positions: -k'1-3' */ @@ -1748,15 +1887,89 @@ return 0; } + + +static pdf_status_t +parse_real (char * string, char ** end, double * out) +{ + int negative; + char * p; + unsigned int l_integer; + unsigned int l_decimal; + double x; + + p = string; + l_integer = 0; + l_decimal = 0; + + /* read sign */ + negative = 0; + if (*p == '-') + { + p++; + negative = 1; + } + else if (*p == '+') + { + p++; + } + + /* read integer part */ + x = 0.0; + while (*p >= '0' && *p <= '9') + { + x *= 10; + x += *p - '0'; + p++; + l_integer++; + } + + /* read decimal part */ + if (*p == '.') + { + unsigned int weight = 10; + p++; + + while(*p >= '0' && *p <= '9') + { + double dig = ((double)(*p - '0')) / weight; + x += dig; + weight *= 10; + l_decimal++; + p++; + } + } + + x = negative? -x: x; + + if (end != NULL) + *end = p; + + if (l_integer || l_decimal) + { + *out = x; + return PDF_OK; + } + else + return PDF_ERROR; +} + + + + static pdf_i32_t get_token (pdf_char_t *buffer, pdf_size_t buf_size, - pdf_size_t *cur_pos, + pdf_size_t start, + pdf_size_t *bot, /* beginning of token */ + pdf_size_t *eot, /* end of token */ double *literal) { pdf_char_t c; char buf[128]; char *end; pdf_u32_t bp; + pdf_size_t cur_pos = start; + pdf_size_t beg_pos; #define PDF_ISWHITE(foo) \ (((foo) <= 0x20) \ @@ -1764,13 +1977,13 @@ (foo) == 0x20 || (foo) == 0x09 || (foo) == 0x0a || (foo) == 0x0c \ || (foo) == 0x0d || (foo) == 0x00)) - c = buffer[*cur_pos]; - while ((*cur_pos < buf_size) && PDF_ISWHITE(buffer[*cur_pos])) + c = buffer[cur_pos]; + while ((cur_pos < buf_size) && PDF_ISWHITE(buffer[cur_pos])) { - (*cur_pos)++; - c = buffer[*cur_pos]; + cur_pos++; + c = buffer[cur_pos]; } - if (*cur_pos == buf_size) + if (cur_pos == buf_size) { /* EOF condition */ return -1; @@ -1778,11 +1991,12 @@ bp = 0; buf[bp++] = c; - (*cur_pos)++; - while ((*cur_pos < buf_size) && !PDF_ISWHITE(buffer[*cur_pos])) + beg_pos = cur_pos; + cur_pos++; + while ((cur_pos < buf_size) && !PDF_ISWHITE(buffer[cur_pos])) { - c = buffer[*cur_pos]; - (*cur_pos)++; + c = buffer[cur_pos]; + cur_pos++; buf[bp++] = c; if (bp >= sizeof(buf)/sizeof(buf[0]) || c >= 0x80) { @@ -1790,11 +2004,19 @@ } } buf[bp] = '\0'; + *bot = beg_pos; + *eot = cur_pos; + if (isdigit(buf[0]) || buf[0] < 'a' ) { - *literal = strtod (buf,&end); - /* HF: recognizes a language larger than specified */ - return (*end) ? OPC_bad : OPC_lit; + if (parse_real (buf, &end, literal) == PDF_OK) + { + return OPC_lit; + } + else + { + return OPC_bad; + } } else { === modified file 'src/base/pdf-fp-func.h' --- src/base/pdf-fp-func.h 2008-12-02 20:28:39 +0000 +++ src/base/pdf-fp-func.h 2009-02-24 17:53:55 +0000 @@ -1,4 +1,4 @@ -/* -*- mode: C -*- Time-stamp: "08/12/02 21:04:31 jemarch" +/* -*- mode: C -*- Time-stamp: "2009-02-24 18:12:56 davazp" * * File: pdf-fp-func.h * Date: Sun Nov 30 18:44:41 2008 @@ -35,8 +35,22 @@ typedef struct pdf_fp_func_s *pdf_fp_func_t; +/* Interal size of the type 4 functions stack */ +#define PDF_FP_FUNC_TYPE4_STACK_SIZE 100 + +typedef union +{ + struct { + pdf_status_t status; + pdf_i32_t op; + pdf_i32_t stack_size; + double stack[PDF_FP_FUNC_TYPE4_STACK_SIZE]; + } type4; +} pdf_fp_func_debug_t; + /* END PUBLIC */ + struct pdf_fp_func_0_s { pdf_u32_t m; @@ -85,7 +99,11 @@ { pdf_char_t *opcodes; pdf_u32_t n_opcodes; - pdf_u32_t n_alloc; + + /* debug info */ + /* translate opcodes offset to code offset */ + pdf_u32_t (*debug_off)[2]; + pdf_size_t debug_size; }; struct pdf_fp_func_s @@ -98,7 +116,8 @@ pdf_i32_t init; pdf_status_t (*eval) (pdf_fp_func_t fun, const pdf_real_t in[], - pdf_real_t out[]); + pdf_real_t out[], + pdf_fp_func_debug_t * debug); union { struct pdf_fp_func_0_s t0; @@ -148,11 +167,13 @@ pdf_real_t range[], pdf_char_t *code, pdf_size_t code_size, + pdf_size_t *error_at, pdf_fp_func_t *function); pdf_status_t pdf_fp_func_eval (pdf_fp_func_t function, const pdf_real_t in[], - pdf_real_t out[]); + pdf_real_t out[], + pdf_fp_func_debug_t * debug); pdf_status_t pdf_fp_func_get_bounds (const pdf_fp_func_t function, pdf_i32_t *in_dimensions, === modified file 'torture/unit/Makefile.am' --- torture/unit/Makefile.am 2009-01-01 19:35:42 +0000 +++ torture/unit/Makefile.am 2009-02-11 15:15:27 +0000 @@ -179,7 +179,8 @@ base/alloc/pdf-realloc.c \ base/alloc/pdf-dealloc.c -TEST_SUITE_FP = base/fp/pdf-fp-func-eval.c +TEST_SUITE_FP = base/fp/pdf-fp-func-eval.c \ + base/fp/pdf-fp-func-4-new.c TEST_ENVIRONMENT = CHARSETALIASDIR=$(top_srcdir)/lib === added file 'torture/unit/base/fp/pdf-fp-func-4-new.c' --- torture/unit/base/fp/pdf-fp-func-4-new.c 1970-01-01 00:00:00 +0000 +++ torture/unit/base/fp/pdf-fp-func-4-new.c 2009-02-24 17:57:41 +0000 @@ -0,0 +1,255 @@ +/* -*- mode: C -*- Time-stamp: "2009-02-24 18:57:05 davazp" + * + * File: pdf-fp-func-eval.c + * Date: Sat Feb 7 18:55:51 2009 + * + * GNU PDF Library - Unit tests for pdf_fp_func_4_new + * + */ + +/* Copyright (C) 2009 Free Software Foundation, Inc. */ + +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include + +/* + * Test: pdf_fp_func_4_new_001 + * Description: + * Create a syntactically wrong function. + * Success condition: + * Return PDF_ENOWRAP and the offset of the error is correct. + */ + +START_TEST(pdf_fp_func_4_new_001) +{ + pdf_fp_func_t func; + pdf_size_t prog_size; + pdf_char_t prog[] = + "{" + " 0 eq" + " {" + " 1 1 eq } dup mul exch dup mul add 1 exch sub } if" + " } if " + "}"; + + pdf_real_t domain[4] = {-1.0, 1.0, -1.0, 1.0}; + pdf_real_t range[2] = {-1.0, 1.0}; + pdf_real_t in[2]; + pdf_real_t out[1]; + pdf_size_t error_at; + pdf_status_t ret; + + + prog_size = sizeof(prog); + + /* Create the function */ + ret = pdf_fp_func_4_new (2, 1, + domain, + range, + prog, + prog_size, + &error_at, + &func); + + fail_if (ret != PDF_ENOWRAP); + fail_if (error_at != 58); +} +END_TEST + + + +/* + * Test: pdf_fp_func_4_new_002 + * Description: + * Create a syntactically wrong function. + * Success condition: + * Return PDF_ENOWRAP and the offset of the error is correct. + */ + +START_TEST(pdf_fp_func_4_new_002) +{ + pdf_fp_func_t func; + pdf_size_t prog_size; + pdf_char_t prog[] = + "{ dup } 2"; + + pdf_real_t domain[4] = {-1.0, 1.0, -1.0, 1.0}; + pdf_real_t range[2] = {-1.0, 1.0}; + pdf_real_t in[2]; + pdf_real_t out[1]; + pdf_size_t error_at; + pdf_status_t ret; + + + prog_size = sizeof(prog); + + /* Create the function */ + ret = pdf_fp_func_4_new (2, 1, + domain, + range, + prog, + prog_size, + &error_at, + &func); + + fail_if (ret != PDF_ENOWRAP); + fail_if (error_at != 8); +} +END_TEST + + +/* + * Test: pdf_fp_func_4_new_003 + * Description: + * Create a syntactically wrong function. + * Success condition: + * Return PDF_ENOWRAP and the offset of the error is correct. + */ + +START_TEST(pdf_fp_func_4_new_003) +{ + pdf_fp_func_t func; + pdf_size_t prog_size; + pdf_char_t prog[] = + "2 { dup }"; + + pdf_real_t domain[4] = {-1.0, 1.0, -1.0, 1.0}; + pdf_real_t range[2] = {-1.0, 1.0}; + pdf_real_t in[2]; + pdf_real_t out[1]; + pdf_size_t error_at; + pdf_status_t ret; + + + prog_size = sizeof(prog); + + /* Create the function */ + ret = pdf_fp_func_4_new (2, 1, + domain, + range, + prog, + prog_size, + &error_at, + &func); + + fail_if (ret != PDF_ENOWRAP); + fail_if (error_at != 0); +} +END_TEST + + +/* + * Test: pdf_fp_func_4_new_004 + * Description: + * Create a syntactically wrong function. + * Success condition: + * Return PDF_EMISSIF and the offset of the error is correct. + */ + +START_TEST(pdf_fp_func_4_new_004) +{ + pdf_fp_func_t func; + pdf_size_t prog_size; + pdf_char_t prog[] = + "{ { dup } }"; + + pdf_real_t domain[4] = {-1.0, 1.0, -1.0, 1.0}; + pdf_real_t range[2] = {-1.0, 1.0}; + pdf_real_t in[2]; + pdf_real_t out[1]; + pdf_size_t error_at; + pdf_status_t ret; + + + prog_size = sizeof(prog); + + /* Create the function */ + ret = pdf_fp_func_4_new (2, 1, + domain, + range, + prog, + prog_size, + &error_at, + &func); + + fail_if (ret != PDF_EMISSIF); + fail_if (error_at != 8); +} +END_TEST + + +/* + * Test: pdf_fp_func_4_new_005 + * Description: + * Create a syntactically wrong function. + * Success condition: + * Return PDF_EMISSBODY and the offset of the error is correct. + */ + +START_TEST(pdf_fp_func_4_new_005) +{ + pdf_fp_func_t func; + pdf_size_t prog_size; + pdf_char_t prog[] = + "{ 2 if }"; + + pdf_real_t domain[4] = {-1.0, 1.0, -1.0, 1.0}; + pdf_real_t range[2] = {-1.0, 1.0}; + pdf_real_t in[2]; + pdf_real_t out[1]; + pdf_size_t error_at; + pdf_status_t ret; + + + prog_size = sizeof(prog); + + /* Create the function */ + ret = pdf_fp_func_4_new (2, 1, + domain, + range, + prog, + prog_size, + &error_at, + &func); + + fail_if (ret != PDF_EMISSBODY); + fail_if (error_at != 4); +} +END_TEST + + + + +/* + * Test case creation function + */ +TCase * +test_pdf_fp_func_4_new (void) +{ + TCase *tc = tcase_create("pdf_fp_func_4_new"); + tcase_add_test(tc, pdf_fp_func_4_new_001); + tcase_add_test(tc, pdf_fp_func_4_new_002); + tcase_add_test(tc, pdf_fp_func_4_new_003); + tcase_add_test(tc, pdf_fp_func_4_new_004); + tcase_add_test(tc, pdf_fp_func_4_new_005); + return tc; +} + + + +/* End of pdf-fp-func-4-new.c */ === modified file 'torture/unit/base/fp/pdf-fp-func-eval.c' --- torture/unit/base/fp/pdf-fp-func-eval.c 2009-01-03 22:17:53 +0000 +++ torture/unit/base/fp/pdf-fp-func-eval.c 2009-02-24 17:57:41 +0000 @@ -1,4 +1,4 @@ -/* -*- mode: C -*- Time-stamp: "09/01/03 21:36:47 jemarch" +/* -*- mode: C -*- Time-stamp: "2009-02-24 18:56:51 davazp" * * File: pdf-fp-func-eval.c * Date: Tue Dec 2 20:11:38 2008 @@ -7,6 +7,22 @@ * */ +/* Copyright (C) 2008, 2009 Free Software Foundation, Inc. */ + +/* This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + #include #include #include @@ -46,13 +62,14 @@ pdf_real_t out[1]; prog_size = strlen (prog); - + /* Create the function */ fail_if(pdf_fp_func_4_new (2, 1, domain, range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -62,25 +79,25 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - simple_dot (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - simple_dot (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - simple_dot (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - simple_dot (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -121,6 +138,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -130,25 +148,25 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_simple_dot (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_simple_dot (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_simple_dot (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_simple_dot (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -194,6 +212,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -203,25 +222,25 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - double_dot (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - double_dot (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - double_dot (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - double_dot (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -268,6 +287,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -277,25 +297,25 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_double_dot (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_double_dot (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_double_dot (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_double_dot (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -342,6 +362,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -351,25 +372,25 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - cosine_dot (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - cosine_dot (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - cosine_dot (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - cosine_dot (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -417,6 +438,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -426,25 +448,25 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - double_f (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - double_f (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - double_f (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - double_f (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -493,6 +515,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -502,25 +525,25 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_double (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_double (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_double (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_double (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -561,6 +584,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -570,25 +594,25 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - line (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - line (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - line (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - line (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -629,6 +653,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -638,25 +663,25 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - line_x (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - line_x (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - line_x (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - line_x (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -697,6 +722,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -706,25 +732,25 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - line_y (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - line_y (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - line_y (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - line_y (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -784,6 +810,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -793,37 +820,38 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - round_f (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - round_f (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - round_f (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - round_f (in[0], in[1])) > ABS_ERROR); /* x = 0.93, y = 0.82 */ in[0] = 0.93; in[1] = 0.82; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - round_f (in[0], in[1])) > ABS_ERROR); } END_TEST /* * Test: pdf_fp_func_eval_012 + * Type: * Description: * Evaluate a type 4 function implementing the predefined function * Ellipse and compare the results with a C implementation. @@ -887,6 +915,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -896,31 +925,31 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_f (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_f (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_f (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_f (in[0], in[1])) > ABS_ERROR); /* x = 0.93, y = 0.82 */ in[0] = 0.93; in[1] = 0.82; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_f (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -961,6 +990,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -970,31 +1000,31 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_a (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_a (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_a (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_a (in[0], in[1])) > ABS_ERROR); /* x = 0.93, y = 0.82 */ in[0] = 0.93; in[1] = 0.82; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_a (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -1035,6 +1065,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -1044,31 +1075,31 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_ellipse_a (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_ellipse_a (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_ellipse_a (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_ellipse_a (in[0], in[1])) > ABS_ERROR); /* x = 0.93, y = 0.82 */ in[0] = 0.93; in[1] = 0.82; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_ellipse_a (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -1109,6 +1140,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -1118,31 +1150,31 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_b (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_b (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_b (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_b (in[0], in[1])) > ABS_ERROR); /* x = 0.93, y = 0.82 */ in[0] = 0.93; in[1] = 0.82; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_b (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -1183,6 +1215,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -1192,31 +1225,31 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_c (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_c (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_c (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_c (in[0], in[1])) > ABS_ERROR); /* x = 0.93, y = 0.82 */ in[0] = 0.93; in[1] = 0.82; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - ellipse_c (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -1257,6 +1290,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -1266,31 +1300,31 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_ellipse_c (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_ellipse_c (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_ellipse_c (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_ellipse_c (in[0], in[1])) > ABS_ERROR); /* x = 0.93, y = 0.82 */ in[0] = 0.93; in[1] = 0.82; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - inverted_ellipse_c (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -1334,6 +1368,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -1343,31 +1378,31 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - square_f (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - square_f (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - square_f (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - square_f (in[0], in[1])) > ABS_ERROR); /* x = 0.93, y = 0.82 */ in[0] = 0.93; in[1] = 0.82; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - square_f (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -1411,6 +1446,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -1420,31 +1456,31 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - cross_f (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - cross_f (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - cross_f (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - cross_f (in[0], in[1])) > ABS_ERROR); /* x = 0.93, y = 0.82 */ in[0] = 0.93; in[1] = 0.82; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - cross_f (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -1485,6 +1521,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -1494,31 +1531,31 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - rhomboid_f (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - rhomboid_f (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - rhomboid_f (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - rhomboid_f (in[0], in[1])) > ABS_ERROR); /* x = 0.93, y = 0.82 */ in[0] = 0.93; in[1] = 0.82; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - rhomboid_f (in[0], in[1])) > ABS_ERROR); } END_TEST @@ -1584,6 +1621,7 @@ range, prog, prog_size, + NULL, &func) != PDF_OK); /* @@ -1593,35 +1631,179 @@ /* x = 0, y = 0 */ in[0] = 0; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - diamond_f (in[0], in[1])) > ABS_ERROR); /* x = 0, y = 1 */ in[0] = 0; in[1] = 1; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - diamond_f (in[0], in[1])) > ABS_ERROR); /* x = 1, y = 0 */ in[0] = 1; in[1] = 0; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - diamond_f (in[0], in[1])) > ABS_ERROR); /* x = 0.322, y = 0.233 */ in[0] = 0.322; in[1] = 0.233; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - diamond_f (in[0], in[1])) > ABS_ERROR); /* x = 0.93, y = 0.82 */ in[0] = 0.93; in[1] = 0.82; - fail_if(pdf_fp_func_eval (func, in, out) != PDF_OK); + fail_if(pdf_fp_func_eval (func, in, out, NULL) != PDF_OK); fail_if(pdf_fp_abs(out[0] - diamond_f (in[0], in[1])) > ABS_ERROR); } END_TEST + + +/* + * Test: pdf_fp_func_eval_022 + * Description: + * Evaluate a wrong type 4 function and detect the error. + * Success condition: + * Return PDF_ETYPE4 and the debug information is correct. + */ + +START_TEST(pdf_fp_func_eval_022) +{ + pdf_fp_func_t func; + pdf_size_t prog_size; + pdf_char_t *prog = + "{ " + " 1 exch div " + " }"; + + pdf_real_t domain[1] = {-1.0}; + pdf_real_t range[1] = {-1.0}; + pdf_real_t in[1]; + pdf_fp_func_debug_t debug; + pdf_real_t out[1]; + + prog_size = strlen (prog); + + /* Create the function */ + fail_if(pdf_fp_func_4_new (1, 1, + domain, + range, + prog, + prog_size, + NULL, + &func) != PDF_OK); + + /* x = 0, y = 0 */ + in[0] = 0; + fail_if (pdf_fp_func_eval (func, in, out, &debug) != PDF_ETYPE4); + fail_if (debug.type4.status != PDF_EMATH); + fail_if (debug.type4.op != 10); + fail_if (debug.type4.stack[0] != 0); + fail_if (debug.type4.stack[1] != 1); +} +END_TEST + + + + +/* + * Test: pdf_fp_func_eval_023 + * Description: + * Evaluate a wrong type 4 function and detect the error. + * Success condition: + * Return PDF_ETYPE4 and the debug information is correct. + */ + +START_TEST(pdf_fp_func_eval_023) +{ + pdf_fp_func_t func; + pdf_size_t prog_size; + pdf_char_t *prog = + "{ " + " sqrt " + " }"; + + pdf_real_t domain[1] = {-1.0}; + pdf_real_t range[1] = {-1.0}; + pdf_real_t in[1]; + pdf_fp_func_debug_t debug; + pdf_real_t out[1]; + + prog_size = strlen (prog); + + /* Create the function */ + fail_if(pdf_fp_func_4_new (1, 1, + domain, + range, + prog, + prog_size, + NULL, + &func) != PDF_OK); + + /* x = 0, y = 0 */ + in[0] = -1; + fail_if (pdf_fp_func_eval (func, in, out, &debug) != PDF_ETYPE4); + fail_if (debug.type4.status != PDF_EINVRANGE); + fail_if (debug.type4.op != 3); + fail_if (debug.type4.stack[0] != -1); +} +END_TEST + + + + + +/* + * Test: pdf_fp_func_eval_024 + * Description: + * Evaluate a wrong type 4 function and detect the error. + * Success condition: + * Return PDF_ETYPE4 and the debug information is correct. + */ + +START_TEST(pdf_fp_func_eval_024) +{ + pdf_fp_func_t func; + pdf_size_t prog_size; + pdf_char_t *prog = + "{ " + " log " + " }"; + + pdf_real_t domain[1] = {-1.0}; + pdf_real_t range[1] = {-1.0}; + pdf_real_t in[1]; + pdf_fp_func_debug_t debug; + pdf_real_t out[1]; + + prog_size = strlen (prog); + + /* Create the function */ + fail_if(pdf_fp_func_4_new (1, 1, + domain, + range, + prog, + prog_size, + NULL, + &func) != PDF_OK); + + /* x = 0, y = 0 */ + in[0] = -1; + fail_if (pdf_fp_func_eval (func, in, out, &debug) != PDF_ETYPE4); + fail_if (debug.type4.status != PDF_EINVRANGE); + fail_if (debug.type4.op != 3); + fail_if (debug.type4.stack[0] != -1); +} +END_TEST + + + + + + /* * Test case creation function */ @@ -1650,6 +1832,9 @@ tcase_add_test(tc, pdf_fp_func_eval_019); tcase_add_test(tc, pdf_fp_func_eval_020); tcase_add_test(tc, pdf_fp_func_eval_021); + tcase_add_test(tc, pdf_fp_func_eval_022); + tcase_add_test(tc, pdf_fp_func_eval_023); + tcase_add_test(tc, pdf_fp_func_eval_024); return tc; } === modified file 'torture/unit/base/fp/tsuite-fp.c' --- torture/unit/base/fp/tsuite-fp.c 2008-12-02 20:28:39 +0000 +++ torture/unit/base/fp/tsuite-fp.c 2009-02-11 15:15:27 +0000 @@ -1,4 +1,4 @@ -/* -*- mode: C -*- Time-stamp: "08/12/02 20:22:07 jemarch" +/* -*- mode: C -*- Time-stamp: "2009-02-07 18:56:43 davazp" * * File: tsuite-fp.c * Date: Tue Dec 2 20:08:22 2008 @@ -25,8 +25,10 @@ #include +extern TCase *test_pdf_fp_func_4_new (void); extern TCase *test_pdf_fp_func_eval (void); + Suite * tsuite_fp () { @@ -34,6 +36,7 @@ s = suite_create("fp"); + suite_add_tcase (s, test_pdf_fp_func_4_new ()); suite_add_tcase (s, test_pdf_fp_func_eval ()); return s; # Begin bundle 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