diff options
Diffstat (limited to 'src/cos_parse.c')
-rw-r--r-- | src/cos_parse.c | 510 |
1 files changed, 20 insertions, 490 deletions
diff --git a/src/cos_parse.c b/src/cos_parse.c index a1587d5..dea67f9 100644 --- a/src/cos_parse.c +++ b/src/cos_parse.c @@ -19,7 +19,7 @@ #include "cos_parse.h" #include "byte_class.h" #include "cos_object.h" -#include "content.h" +#include "cos_content.h" #include "pdf_doc.h" /** increments in which cos string allocations are extended */ @@ -1246,367 +1246,9 @@ parse_operator(struct cos_stream *stream, } -static const char*operator_name(enum content_operator operator) -{ - switch(operator) { - case CONTENT_OP_b: return "b"; - case CONTENT_OP_B: return "B"; - case CONTENT_OP_b_: return "b*"; - case CONTENT_OP_B_: return "B*"; - case CONTENT_OP_BDC: return "BDC"; - case CONTENT_OP_BI: return "BI"; - case CONTENT_OP_BMC: return "BMC"; - case CONTENT_OP_BT: return "BT"; - case CONTENT_OP_BX: return "BX"; - case CONTENT_OP_c: return "c"; - case CONTENT_OP_cm: return "cm"; - case CONTENT_OP_CS: return "CS"; - case CONTENT_OP_cs: return "cs"; - case CONTENT_OP_d: return "d"; - case CONTENT_OP_d0: return "d0"; - case CONTENT_OP_d1: return "d1"; - case CONTENT_OP_Do: return "Do"; - case CONTENT_OP_DP: return "DP"; - case CONTENT_OP_EI: return "EI"; - case CONTENT_OP_EMC: return "EMC"; - case CONTENT_OP_ET: return "ET"; - case CONTENT_OP_EX: return "EX"; - case CONTENT_OP_f: return "f"; - case CONTENT_OP_F: return "F"; - case CONTENT_OP_f_: return "f*"; - case CONTENT_OP_G: return "G"; - case CONTENT_OP_g: return "g"; - case CONTENT_OP_gs: return "gs"; - case CONTENT_OP_h: return "h"; - case CONTENT_OP_i: return "i"; - case CONTENT_OP_ID: return "ID"; - case CONTENT_OP_j: return "j"; - case CONTENT_OP_J: return "J"; - case CONTENT_OP_K: return "K"; - case CONTENT_OP_k: return "k"; - case CONTENT_OP_l: return "l"; - case CONTENT_OP_m: return "m"; - case CONTENT_OP_M: return "M"; - case CONTENT_OP_MP: return "MP"; - case CONTENT_OP_n: return "n"; - case CONTENT_OP_q: return "q"; - case CONTENT_OP_Q: return "Q"; - case CONTENT_OP_re: return "re"; - case CONTENT_OP_RG: return "RG"; - case CONTENT_OP_rg: return "rg"; - case CONTENT_OP_ri: return "ri"; - case CONTENT_OP_s: return "s"; - case CONTENT_OP_S: return "S"; - case CONTENT_OP_SC: return "SC"; - case CONTENT_OP_sc: return "sc"; - case CONTENT_OP_SCN: return "SCN"; - case CONTENT_OP_scn: return "scn"; - case CONTENT_OP_sh: return "sh"; - case CONTENT_OP_T_: return "T*"; - case CONTENT_OP_Tc: return "Tc"; - case CONTENT_OP_Td: return "Td"; - case CONTENT_OP_TD: return "TD"; - case CONTENT_OP_Tf: return "Tf"; - case CONTENT_OP_Tj: return "Tj"; - case CONTENT_OP_TJ: return "TJ"; - case CONTENT_OP_TL: return "TL"; - case CONTENT_OP_Tm: return "Tm"; - case CONTENT_OP_Tr: return "Tr"; - case CONTENT_OP_Ts: return "Ts"; - case CONTENT_OP_Tw: return "Tw"; - case CONTENT_OP_Tz: return "Tz"; - case CONTENT_OP_v: return "v"; - case CONTENT_OP_w: return "w"; - case CONTENT_OP_W: return "W"; - case CONTENT_OP_W_: return "W_"; - case CONTENT_OP_y: return "y"; - case CONTENT_OP__: return "\'"; - case CONTENT_OP___: return "\""; - } - return "????"; -} - /** - * move number operands from list into operation - * - * This ensures all operands are correctly handled not just the wanted ones - * - * \param wanted The number of wanted operands to place in the operation - * \param operands The array of operands from the parse - * \param operand_idx The number of operands from the parse - * \param operation_out The operation to place numbers in - */ -static nspdferror -copy_numbers(unsigned int wanted, - struct cos_object **operands, - unsigned int *operand_idx, - struct content_operation *operation_out) -{ - nspdferror res; - unsigned int index = 0; - - while ((index < (*operand_idx)) && - (index < wanted)) { - /* process wanted operands */ - res = cos_get_number(NULL, - *(operands + index), - &operation_out->u.number[index]); - if (res != NSPDFERROR_OK) { - printf("operand %d could not be set in operation (code %d)\n", - index, res); - } - cos_free_object(*(operands + index)); - index++; - } - if ((*operand_idx) > index) { - printf("operator %s that takes %d operands passed %d\n", - operator_name(operation_out->operator), wanted, *operand_idx); - while (index < (*operand_idx)) { - cos_free_object(*(operands + index)); - index++; - } - } else if ((*operand_idx) < index) { - printf("operator %s that takes %d operands passed %d\n", - operator_name(operation_out->operator), wanted, *operand_idx); - } - - *operand_idx = 0; /* all operands freed */ - - return NSPDFERROR_OK; -} - -static nspdferror -copy_integers(unsigned int wanted, - struct cos_object **operands, - unsigned int *operand_idx, - struct content_operation *operation_out) -{ - nspdferror res; - unsigned int index = 0; - - while ((index < (*operand_idx)) && - (index < wanted)) { - /* process wanted operands */ - res = cos_get_int(NULL, - *(operands + index), - &operation_out->u.i[index]); - if (res != NSPDFERROR_OK) { - printf("operand %d could not be set in operation (code %d)\n", - index, res); - } - cos_free_object(*(operands + index)); - index++; - } - if ((*operand_idx) > index) { - printf("operator %s that takes %d operands passed %d\n", - operator_name(operation_out->operator), wanted, *operand_idx); - while (index < (*operand_idx)) { - cos_free_object(*(operands + index)); - index++; - } - } else if ((*operand_idx) < index) { - printf("operator %s that takes %d operands passed %d\n", - operator_name(operation_out->operator), wanted, *operand_idx); - } - - *operand_idx = 0; /* all operands freed */ - - return NSPDFERROR_OK; -} - -static nspdferror -copy_string(struct cos_object **operands, - unsigned int *operand_idx, - struct content_operation *operation_out) -{ - nspdferror res; - unsigned int index = 0; - struct cos_string *string; - - if ((*operand_idx) == 0) { - printf("operator %s that takes %d operands passed %d\n", - operator_name(operation_out->operator), 1, *operand_idx); - operation_out->u.string.length = 0; - return NSPDFERROR_OK; - } - - /* process wanted operands */ - res = cos_get_string(NULL, *operands, &string); - if (res != NSPDFERROR_OK) { - printf("string could not be set in operation (code %d)\n", res); - operation_out->u.string.length = 0; - } else { - operation_out->u.string.length = string->length; - if (string->length > content_string_intrnl_lngth) { - /* steal the string from the object */ - operation_out->u.string.u.pdata = string->data; - string->alloc = 0; - string->length = 0; - /*printf("external string \"%.*s\"\n", - operation_out->u.string.length, - operation_out->u.string.u.pdata);*/ - } else { - memcpy(operation_out->u.string.u.cdata, - string->data, - string->length); - /*printf("internal string \"%.*s\"\n", - operation_out->u.string.length, - operation_out->u.string.u.cdata);*/ - } - } - - if ((*operand_idx) > 1) { - printf("operator %s that takes %d operands passed %d\n", - operator_name(operation_out->operator), 1, *operand_idx); - } - - /* free all operands */ - while (index < (*operand_idx)) { - cos_free_object(*(operands + index)); - index++; - } - *operand_idx = 0; - - return NSPDFERROR_OK; -} - -static nspdferror -copy_array(struct cos_object **operands, - unsigned int *operand_idx, - struct content_operation *operation_out) -{ - unsigned int index = 0; - - if ((*operand_idx) == 0) { - printf("operator %s that takes %d operands passed %d\n", - operator_name(operation_out->operator), 1, *operand_idx); - operation_out->u.array.length = 0; - return NSPDFERROR_OK; - } - - /* process wanted operands */ - if ((*operands)->type != COS_TYPE_ARRAY) { - printf("operand was not an array\n"); - operation_out->u.array.length = 0; - } else { - operation_out->u.array.length = (*operands)->u.array->length; - /* steal the values from the array object */ - operation_out->u.array.values = (*operands)->u.array->values; - (*operands)->u.array->alloc = 0; - (*operands)->u.array->length = 0; - } - - if ((*operand_idx) > 1) { - printf("operator %s that takes %d operands passed %d\n", - operator_name(operation_out->operator), 1, *operand_idx); - } - - /* free all operands */ - while (index < (*operand_idx)) { - cos_free_object(*(operands + index)); - index++; - } - *operand_idx = 0; - - return NSPDFERROR_OK; -} - - -static nspdferror -copy_name(struct cos_object **operands, - unsigned int *operand_idx, - struct content_operation *operation_out) -{ - unsigned int index = 0; - - if ((*operand_idx) == 0) { - printf("operator %s that takes %d operands passed %d\n", - operator_name(operation_out->operator), 1, *operand_idx); - operation_out->u.name = NULL; - return NSPDFERROR_OK; - } - - /* process wanted operands */ - if ((*operands)->type != COS_TYPE_NAME) { - printf("operand was not a name\n"); - operation_out->u.name = NULL; - } else { - /* steal the name from the name object */ - operation_out->u.name = (*operands)->u.name; - (*operands)->u.name = NULL; - } - - if ((*operand_idx) > 1) { - printf("operator %s that takes %d operands passed %d\n", - operator_name(operation_out->operator), 1, *operand_idx); - } - - /* free all operands */ - while (index < (*operand_idx)) { - cos_free_object(*(operands + index)); - index++; - } - *operand_idx = 0; - - return NSPDFERROR_OK; -} - -static nspdferror -copy_name_number(struct cos_object **operands, - unsigned int *operand_idx, - struct content_operation *operation_out) -{ - unsigned int index = 0; - - if ((*operand_idx) == 0) { - printf("operator %s that takes %d operands passed %d\n", - operator_name(operation_out->operator), 2, *operand_idx); - operation_out->u.namenumber.name = NULL; - return NSPDFERROR_OK; - } - - /* process wanted operands */ - if ((*operands)->type != COS_TYPE_NAME) { - printf("operand was not a name\n"); - operation_out->u.namenumber.name = NULL; - } else { - /* steal the name from the name object */ - operation_out->u.namenumber.name = (*operands)->u.name; - (*operands)->u.name = NULL; - - operation_out->u.namenumber.number = 0; - /* get the number */ - if ((*operand_idx) > 1) { - nspdferror res; - res = cos_get_number(NULL, - *(operands + 1), - &operation_out->u.namenumber.number); - if (res != NSPDFERROR_OK) { - printf("operand 1 could not be set in operation (code %d)\n", res); - } - } else { - printf("operator %s that takes %d operands passed %d\n", - operator_name(operation_out->operator), 2, *operand_idx); - } - } - - if ((*operand_idx) > 2) { - printf("operator %s that takes %d operands passed %d\n", - operator_name(operation_out->operator), 2, *operand_idx); - } - - /* free all operands */ - while (index < (*operand_idx)) { - cos_free_object(*(operands + index)); - index++; - } - *operand_idx = 0; - - return NSPDFERROR_OK; -} - -/** largest number of operands any operator requires + * largest number of operands any operator requires * * This would be 6 except scn in Nchannel colourspace may have 32 */ @@ -1707,7 +1349,6 @@ parse_content_operation(struct nspdf_doc *doc, res = parse_operator(stream, &offset, &operator); } - /* printf("returning operator %d with %d operands %d to %d of %d\n>>>%.*s<<<\n", operator, @@ -1719,130 +1360,10 @@ parse_content_operation(struct nspdf_doc *doc, stream->data + (*offset_out)); */ - operation_out->operator = operator; - - switch (operator) { - case CONTENT_OP_b: - case CONTENT_OP_B: - case CONTENT_OP_b_: - case CONTENT_OP_B_: - case CONTENT_OP_BI: - case CONTENT_OP_BT: - case CONTENT_OP_BX: - case CONTENT_OP_EI: - case CONTENT_OP_EMC: - case CONTENT_OP_ET: - case CONTENT_OP_EX: - case CONTENT_OP_f: - case CONTENT_OP_F: - case CONTENT_OP_f_: - case CONTENT_OP_h: - case CONTENT_OP_ID: - case CONTENT_OP_n: - case CONTENT_OP_q: - case CONTENT_OP_Q: - case CONTENT_OP_s: - case CONTENT_OP_S: - case CONTENT_OP_T_: - case CONTENT_OP_W: - case CONTENT_OP_W_: - /* no operands */ - res = copy_numbers(0, operands, operand_idx, operation_out); - break; - - case CONTENT_OP_G: - case CONTENT_OP_g: - case CONTENT_OP_i: - case CONTENT_OP_M: - case CONTENT_OP_Tc: - case CONTENT_OP_TL: - case CONTENT_OP_Ts: - case CONTENT_OP_Tw: - case CONTENT_OP_Tz: - case CONTENT_OP_w: - /* one number */ - res = copy_numbers(1, operands, operand_idx, operation_out); - break; - - case CONTENT_OP_d0: - case CONTENT_OP_l: - case CONTENT_OP_m: - case CONTENT_OP_Td: - case CONTENT_OP_TD: - /* two numbers */ - res = copy_numbers(2, operands, operand_idx, operation_out); - break; - - case CONTENT_OP_RG: - case CONTENT_OP_rg: - /* three numbers */ - res = copy_numbers(3, operands, operand_idx, operation_out); - break; - - case CONTENT_OP_K: - case CONTENT_OP_k: - case CONTENT_OP_re: - case CONTENT_OP_v: - case CONTENT_OP_y: - /* four numbers */ - res = copy_numbers(4, operands, operand_idx, operation_out); - break; - - case CONTENT_OP_c: - case CONTENT_OP_cm: - case CONTENT_OP_d1: - case CONTENT_OP_Tm: - /* six numbers */ - res = copy_numbers(6, operands, operand_idx, operation_out); - break; - - case CONTENT_OP_Tj: - case CONTENT_OP__: - /* single string */ - res = copy_string(operands, operand_idx, operation_out); - break; - - case CONTENT_OP_TJ: - /* single array */ - res = copy_array(operands, operand_idx, operation_out); - break; - - case CONTENT_OP_Tf: - /* name and number */ - res = copy_name_number(operands, operand_idx, operation_out); - break; - - case CONTENT_OP_gs: - /* name */ - res = copy_name(operands, operand_idx, operation_out); - break; - - case CONTENT_OP_j: - case CONTENT_OP_J: - /* one integer */ - res = copy_integers(1, operands, operand_idx, operation_out); - break; - - case CONTENT_OP_BDC: - case CONTENT_OP_BMC: - case CONTENT_OP_CS: - case CONTENT_OP_cs: - case CONTENT_OP_d: - case CONTENT_OP_Do: - case CONTENT_OP_DP: - case CONTENT_OP_MP: - case CONTENT_OP_ri: - case CONTENT_OP_SC: - case CONTENT_OP_sc: - case CONTENT_OP_SCN: - case CONTENT_OP_scn: - case CONTENT_OP_sh: - case CONTENT_OP_Tr: - case CONTENT_OP___: - res = copy_numbers(0, operands, operand_idx, operation_out); - break; - } - + res = nspdf__cos_content_convert(operator, + operands, + operand_idx, + operation_out); if (res == NSPDFERROR_OK) { *operand_idx = 0; @@ -1870,15 +1391,24 @@ cos_parse_content_streams(struct nspdf_doc *doc, //#define SHOW_STRUCT_SIZE #ifdef SHOW_STRUCT_SIZE struct content_operation foo; - printf("content_operation length:%d\nfloat:%d\nunsigned int:%d\n" - "union %d\n" - " n:%d string:%d string.u:%d string.u.cdata:%d array:%d\n", - sizeof(struct content_operation), + printf("float:%lu unsigned int:%lu\n" + "struct content_operation:%lu\n" + " operator:%lu\n" + " union:%lu\n" + " number:%lu\n" + " string:%lu\n" + " string.length:%lu\n" + " string.u:%lu\n" + " string.u.cdata:%lu\n" + " array:%lu\n", sizeof(float), sizeof(unsigned int), + sizeof(struct content_operation), + sizeof(foo.operator), sizeof(foo.u), - sizeof(foo.u.n), + sizeof(foo.u.number), sizeof(foo.u.string), + sizeof(foo.u.string.length), sizeof(foo.u.string.u), sizeof(foo.u.string.u.cdata), sizeof(foo.u.array)); |