| … | |
… | |
| 16 | along with this program; if not, write to the Free Software |
16 | along with this program; if not, write to the Free Software |
| 17 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
17 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. |
| 18 | */ |
18 | */ |
| 19 | |
19 | |
| 20 | #include "config.h" |
20 | #include "config.h" |
|
|
21 | #include "compat.h" |
|
|
22 | |
| 21 | #include <stdlib.h> |
23 | #include <stdlib.h> |
| 22 | #include <math.h> |
24 | #include <math.h> |
| 23 | |
25 | |
| 24 | #include "data.h" |
|
|
| 25 | #include "parse_routines.h" |
26 | #include "parse_routines.h" |
|
|
27 | #include "error.h" |
| 26 | |
28 | |
| 27 | int psiconv_parse_color(const psiconv_buffer buf, int lev, psiconv_u32 off, |
29 | int psiconv_parse_color(const psiconv_buffer buf, int lev, psiconv_u32 off, |
| 28 | int *length, psiconv_color *result) |
30 | int *length, psiconv_color *result) |
| 29 | { |
31 | { |
| 30 | int res = 0; |
32 | int res = 0; |
| … | |
… | |
| 145 | else if (temp == 0x02) |
147 | else if (temp == 0x02) |
| 146 | (*result)->kind = psiconv_border_double; |
148 | (*result)->kind = psiconv_border_double; |
| 147 | else if (temp == 0x03) |
149 | else if (temp == 0x03) |
| 148 | (*result)->kind = psiconv_border_dotted; |
150 | (*result)->kind = psiconv_border_dotted; |
| 149 | else if (temp == 0x04) |
151 | else if (temp == 0x04) |
| 150 | (*result)->kind = psiconv_border_striped; |
152 | (*result)->kind = psiconv_border_dashed; |
| 151 | else if (temp == 0x05) |
153 | else if (temp == 0x05) |
| 152 | (*result)->kind = psiconv_border_dotstripe; |
154 | (*result)->kind = psiconv_border_dotdashed; |
| 153 | else if (temp == 0x06) |
155 | else if (temp == 0x06) |
| 154 | (*result)->kind = psiconv_border_dotdotstripe; |
156 | (*result)->kind = psiconv_border_dotdotdashed; |
| 155 | else { |
157 | else { |
| 156 | psiconv_warn(lev+2,off,"Unknown border kind (defaults to `none')"); |
158 | psiconv_warn(lev+2,off,"Unknown border kind (defaults to `none')"); |
| 157 | (*result)->kind = psiconv_border_none; |
159 | (*result)->kind = psiconv_border_none; |
| 158 | } |
160 | } |
| 159 | psiconv_debug(lev+2,off+len,"Kind: %02x",temp); |
161 | psiconv_debug(lev+2,off+len,"Kind: %02x",temp); |
| … | |
… | |
| 161 | |
163 | |
| 162 | psiconv_progress(lev+2,off+len,"Going to read border thickness"); |
164 | psiconv_progress(lev+2,off+len,"Going to read border thickness"); |
| 163 | (*result)->thickness = psiconv_read_size(buf,lev+2,off+len,&leng,&res); |
165 | (*result)->thickness = psiconv_read_size(buf,lev+2,off+len,&leng,&res); |
| 164 | if (res) |
166 | if (res) |
| 165 | goto ERROR2; |
167 | goto ERROR2; |
|
|
168 | #if 0 |
|
|
169 | /* This seems no longer necessary to test? */ |
| 166 | if (((*result)->kind != psiconv_border_solid) && |
170 | if (((*result)->kind != psiconv_border_solid) && |
| 167 | ((*result)->kind != psiconv_border_double) && |
171 | ((*result)->kind != psiconv_border_double) && |
| 168 | ((*result)->thickness != 0.0) && |
172 | ((*result)->thickness != 0.0) && |
| 169 | (fabs((*result)->thickness - 1/20) >= 1/1000)) { |
173 | (fabs((*result)->thickness - 1/20) >= 1/1000)) { |
| 170 | psiconv_warn(lev+2,off, |
174 | psiconv_warn(lev+2,off, |
| 171 | "Border thickness specified for unlikely border type"); |
175 | "Border thickness specified for unlikely border type"); |
| 172 | } |
176 | } |
|
|
177 | #endif |
| 173 | psiconv_debug(lev+2,off+len,"Thickness: %f",(*result)->thickness); |
178 | psiconv_debug(lev+2,off+len,"Thickness: %f",(*result)->thickness); |
| 174 | len += leng; |
179 | len += leng; |
| 175 | |
180 | |
| 176 | psiconv_progress(lev+2,off+len,"Going to read the border color"); |
181 | psiconv_progress(lev+2,off+len,"Going to read the border color"); |
| 177 | if ((psiconv_parse_color(buf,lev+2,off+len,&leng,&(*result)->color))) |
182 | if ((psiconv_parse_color(buf,lev+2,off+len,&leng,&(*result)->color))) |
| 178 | goto ERROR2; |
183 | goto ERROR2; |
| 179 | len += leng; |
184 | len += leng; |
| 180 | |
185 | |
| 181 | psiconv_progress(lev+2,off+len,"Going to read the final unknown byte " |
186 | psiconv_progress(lev+2,off+len,"Going to read the final unknown byte " |
| 182 | "(0x01 expected)"); |
187 | "(0x00 or 0x01 expected)"); |
| 183 | temp = psiconv_read_u8(buf,lev+2,off + len,&res); |
188 | temp = psiconv_read_u8(buf,lev+2,off + len,&res); |
| 184 | if (res) |
189 | if (res) |
| 185 | goto ERROR3; |
190 | goto ERROR3; |
| 186 | if (temp != 0x01) { |
191 | if ((temp != 0x01) && (temp != 0x00)) { |
| 187 | psiconv_warn(lev+2,off,"Unknown last byte in border specification"); |
192 | psiconv_warn(lev+2,off,"Unknown last byte in border specification"); |
| 188 | psiconv_debug(lev+2,off+len, "Last byte: read %02x, expected %02x", |
193 | psiconv_debug(lev+2,off+len, "Last byte: read %02x, expected %02x or %02x", |
| 189 | temp,0x01); |
194 | temp,0x00,0x01); |
| 190 | } |
195 | } |
| 191 | len ++; |
196 | len ++; |
| 192 | |
197 | |
| 193 | if (length) |
198 | if (length) |
| 194 | *length = len; |
199 | *length = len; |
| … | |
… | |
| 270 | psiconv_progress(lev+1,off + len - 1, |
275 | psiconv_progress(lev+1,off + len - 1, |
| 271 | "End of bullet data (total length: %08x)",len); |
276 | "End of bullet data (total length: %08x)",len); |
| 272 | |
277 | |
| 273 | if (length) |
278 | if (length) |
| 274 | *length = len; |
279 | *length = len; |
| 275 | return res; |
280 | return 0; |
| 276 | |
281 | |
| 277 | ERROR3: |
282 | ERROR3: |
| 278 | psiconv_free_color((*result)->color); |
283 | psiconv_free_color((*result)->color); |
| 279 | ERROR2: |
284 | ERROR2: |
| 280 | free (result); |
285 | free (result); |
| … | |
… | |
| 445 | result->justify_ver = psiconv_justify_bottom; |
450 | result->justify_ver = psiconv_justify_bottom; |
| 446 | } |
451 | } |
| 447 | psiconv_debug(lev+3,off+len,"Justify: %02x",temp); |
452 | psiconv_debug(lev+3,off+len,"Justify: %02x",temp); |
| 448 | len ++; |
453 | len ++; |
| 449 | case 0x07: |
454 | case 0x07: |
| 450 | psiconv_progress(lev+3,off+len,"Going to read interline distance"); |
455 | psiconv_progress(lev+3,off+len,"Going to read linespacing distance"); |
| 451 | result->interline = psiconv_read_size(buf,lev+3,off+len,&leng,&res); |
456 | result->linespacing = psiconv_read_size(buf,lev+3,off+len,&leng,&res); |
| 452 | if (res) |
457 | if (res) |
| 453 | goto ERROR1; |
458 | goto ERROR1; |
| 454 | len += leng; |
459 | len += leng; |
| 455 | break; |
460 | break; |
| 456 | case 0x08: |
461 | case 0x08: |
| 457 | psiconv_progress(lev+3,off+len,"Going to read interline exact"); |
462 | psiconv_progress(lev+3,off+len,"Going to read linespacing exact"); |
| 458 | if ((res = psiconv_parse_bool(buf,lev+3,off+len,&leng, |
463 | if ((res = psiconv_parse_bool(buf,lev+3,off+len,&leng, |
| 459 | &result->interline_exact))) |
464 | &result->linespacing_exact))) |
| 460 | goto ERROR1; |
465 | goto ERROR1; |
| 461 | len += leng; |
466 | len += leng; |
| 462 | break; |
467 | break; |
| 463 | case 0x09: |
468 | case 0x09: |
| 464 | psiconv_progress(lev+3,off+len,"Going to read top space"); |
469 | psiconv_progress(lev+3,off+len,"Going to read top space"); |
| 465 | result->top_space = psiconv_read_size(buf,lev+3,off+len,&leng,&res); |
470 | result->space_above = psiconv_read_size(buf,lev+3,off+len,&leng,&res); |
| 466 | if (res) |
471 | if (res) |
| 467 | goto ERROR1; |
472 | goto ERROR1; |
| 468 | len += leng; |
473 | len += leng; |
| 469 | break; |
474 | break; |
| 470 | case 0x0a: |
475 | case 0x0a: |
| 471 | psiconv_progress(lev+3,off+len,"Going to read bottom space"); |
476 | psiconv_progress(lev+3,off+len,"Going to read bottom space"); |
| 472 | result->bottom_space = psiconv_read_size(buf,lev+3,off+len,&leng,&res); |
477 | result->space_below = psiconv_read_size(buf,lev+3,off+len,&leng,&res); |
| 473 | if (res) |
478 | if (res) |
| 474 | goto ERROR1; |
479 | goto ERROR1; |
| 475 | len += leng; |
480 | len += leng; |
| 476 | break; |
481 | break; |
| 477 | case 0x0b: |
482 | case 0x0b: |
| 478 | psiconv_progress(lev+3,off+len,"Going to read on one page"); |
483 | psiconv_progress(lev+3,off+len,"Going to read on one page"); |
| 479 | if ((res = psiconv_parse_bool(buf,lev+3,off+len,&leng, |
484 | if ((res = psiconv_parse_bool(buf,lev+3,off+len,&leng, |
| 480 | &result->on_one_page))) |
485 | &result->keep_together))) |
| 481 | goto ERROR1; |
486 | goto ERROR1; |
| 482 | len += leng; |
487 | len += leng; |
| 483 | break; |
488 | break; |
| 484 | case 0x0c: |
489 | case 0x0c: |
| 485 | psiconv_progress(lev+3,off+len,"Going to read together with"); |
490 | psiconv_progress(lev+3,off+len,"Going to read together with"); |
| 486 | if ((res = psiconv_parse_bool(buf,lev+3,off+len,&leng, |
491 | if ((res = psiconv_parse_bool(buf,lev+3,off+len,&leng, |
| 487 | &result->together_with))) |
492 | &result->keep_with_next))) |
| 488 | goto ERROR1; |
493 | goto ERROR1; |
| 489 | len += leng; |
494 | len += leng; |
| 490 | break; |
495 | break; |
| 491 | case 0x0d: |
496 | case 0x0d: |
| 492 | psiconv_progress(lev+3,off+len,"Going to read on next page"); |
497 | psiconv_progress(lev+3,off+len,"Going to read on next page"); |
| … | |
… | |
| 500 | if ((res = psiconv_parse_bool(buf,lev+3,off+len,&leng, |
505 | if ((res = psiconv_parse_bool(buf,lev+3,off+len,&leng, |
| 501 | &result->no_widow_protection))) |
506 | &result->no_widow_protection))) |
| 502 | goto ERROR1; |
507 | goto ERROR1; |
| 503 | len += leng; |
508 | len += leng; |
| 504 | break; |
509 | break; |
|
|
510 | case 0x0f: |
|
|
511 | psiconv_progress(lev+3,off+len,"Going to read wrap to fit cell limits"); |
|
|
512 | if ((res = psiconv_parse_bool(buf,lev+3,off+len,&leng, |
|
|
513 | &result->wrap_to_fit_cell))) |
|
|
514 | goto ERROR1; |
|
|
515 | len += leng; |
|
|
516 | break; |
| 505 | case 0x10: |
517 | case 0x10: |
| 506 | psiconv_progress(lev+3,off+len,"Going to read border distance to text"); |
518 | psiconv_progress(lev+3,off+len,"Going to read border distance to text"); |
| 507 | result->border_distance = psiconv_read_length(buf,lev+3, |
519 | result->border_distance = psiconv_read_length(buf,lev+3, |
| 508 | off+len,&leng,&res); |
520 | off+len,&leng,&res); |
| 509 | if (res) |
521 | if (res) |
| … | |
… | |
| 542 | result->right_border = temp_border; |
554 | result->right_border = temp_border; |
| 543 | len += leng; |
555 | len += leng; |
| 544 | break; |
556 | break; |
| 545 | case 0x15: |
557 | case 0x15: |
| 546 | psiconv_progress(lev+3,off+len,"Going to read bullet"); |
558 | psiconv_progress(lev+3,off+len,"Going to read bullet"); |
| 547 | if ((res = psiconv_parse_bullet(buf,lev+3,off+len,&leng,&temp_bullet))); |
559 | if ((res = psiconv_parse_bullet(buf,lev+3,off+len,&leng,&temp_bullet))) |
| 548 | goto ERROR1; |
560 | goto ERROR1; |
| 549 | psiconv_free_bullet(result->bullet); |
561 | psiconv_free_bullet(result->bullet); |
| 550 | result->bullet = temp_bullet; |
562 | result->bullet = temp_bullet; |
| 551 | len += leng; |
563 | len += leng; |
| 552 | break; |
564 | break; |
| … | |
… | |
| 636 | if (res) |
648 | if (res) |
| 637 | goto ERROR1; |
649 | goto ERROR1; |
| 638 | psiconv_debug(lev+3,off+len,"Id: %02x",id); |
650 | psiconv_debug(lev+3,off+len,"Id: %02x",id); |
| 639 | len ++; |
651 | len ++; |
| 640 | switch(id) { |
652 | switch(id) { |
|
|
653 | case 0x18: |
|
|
654 | psiconv_progress(lev+3,off+len,"Going to skip an unknown setting"); |
|
|
655 | len ++; |
|
|
656 | break; |
| 641 | case 0x19: |
657 | case 0x19: |
| 642 | psiconv_progress(lev+3,off+len,"Going to read text color"); |
658 | psiconv_progress(lev+3,off+len,"Going to read text color"); |
| 643 | if ((res = psiconv_parse_color(buf,lev+3,off+len, &leng,&temp_color))) |
659 | if ((res = psiconv_parse_color(buf,lev+3,off+len, &leng,&temp_color))) |
| 644 | goto ERROR1; |
660 | goto ERROR1; |
| 645 | psiconv_free_color(result->color); |
661 | psiconv_free_color(result->color); |
| … | |
… | |
| 651 | if ((res = psiconv_parse_color(buf,lev+2,off+len, &leng,&temp_color))) |
667 | if ((res = psiconv_parse_color(buf,lev+2,off+len, &leng,&temp_color))) |
| 652 | goto ERROR1; |
668 | goto ERROR1; |
| 653 | psiconv_free_color(result->back_color); |
669 | psiconv_free_color(result->back_color); |
| 654 | result->back_color = temp_color; |
670 | result->back_color = temp_color; |
| 655 | len += leng; |
671 | len += leng; |
|
|
672 | break; |
|
|
673 | case 0x1b: |
|
|
674 | psiconv_progress(lev+3,off+len,"Going to skip an unknown setting"); |
|
|
675 | len ++; |
| 656 | break; |
676 | break; |
| 657 | case 0x1c: |
677 | case 0x1c: |
| 658 | psiconv_progress(lev+3,off+len,"Going to read font size"); |
678 | psiconv_progress(lev+3,off+len,"Going to read font size"); |
| 659 | result->font_size = psiconv_read_size(buf,lev+3,off+len,&leng,&res); |
679 | result->font_size = psiconv_read_size(buf,lev+3,off+len,&leng,&res); |
| 660 | if (res) |
680 | if (res) |
| … | |
… | |
| 697 | &result->underline))) |
717 | &result->underline))) |
| 698 | goto ERROR1; |
718 | goto ERROR1; |
| 699 | len += leng; |
719 | len += leng; |
| 700 | break; |
720 | break; |
| 701 | case 0x21: |
721 | case 0x21: |
| 702 | psiconv_progress(lev+3,off+len,"Going to read strike_out"); |
722 | psiconv_progress(lev+3,off+len,"Going to read strikethrough"); |
| 703 | if ((res = psiconv_parse_bool(buf,lev+3,off+len,&leng, |
723 | if ((res = psiconv_parse_bool(buf,lev+3,off+len,&leng, |
| 704 | &result->strike_out))) |
724 | &result->strikethrough))) |
| 705 | goto ERROR1; |
725 | goto ERROR1; |
| 706 | len += leng; |
726 | len += leng; |
| 707 | break; |
727 | break; |
| 708 | case 0x22: |
728 | case 0x22: |
| 709 | psiconv_progress(lev+3,off+len,"Going to read font"); |
729 | psiconv_progress(lev+3,off+len,"Going to read font"); |
| 710 | if ((res = psiconv_parse_font(buf,lev+3,off+len, &leng, &temp_font))) |
730 | if ((res = psiconv_parse_font(buf,lev+3,off+len, &leng, &temp_font))) |
| 711 | goto ERROR1; |
731 | goto ERROR1; |
| 712 | psiconv_free_font(result->font); |
732 | psiconv_free_font(result->font); |
| 713 | result->font = temp_font; |
733 | result->font = temp_font; |
| 714 | len += leng; |
734 | len += leng; |
|
|
735 | break; |
|
|
736 | case 0x23: |
|
|
737 | psiconv_progress(lev+3,off+len,"Going to skip an unknown setting"); |
|
|
738 | len ++; |
| 715 | break; |
739 | break; |
| 716 | case 0x24: |
740 | case 0x24: |
| 717 | psiconv_progress(lev+3,off+len, |
741 | psiconv_progress(lev+3,off+len, |
| 718 | "Going to read unknown code 0x24 (%02x expected)", 0); |
742 | "Going to read unknown code 0x24 (%02x expected)", 0); |
| 719 | temp = psiconv_read_u8(buf,lev+3,off+len,&res); |
743 | temp = psiconv_read_u8(buf,lev+3,off+len,&res); |