1 /*---------------------------------------------------------------------------*
2 | PDFlib - A library for generating PDF on the fly |
3 +---------------------------------------------------------------------------+
4 | Copyright (c) 1997-2005 Thomas Merz and PDFlib GmbH. All rights reserved. |
5 +---------------------------------------------------------------------------+
6 | |
7 | This software is subject to the PDFlib license. It is NOT in the |
8 | public domain. Extended versions and commercial licenses are |
9 | available, please check http://www.pdflib.com. |
10 | |
11 *---------------------------------------------------------------------------*/
12
13 /* $Id: pdflib_tcl.c,v 1.56.2.3 2009/04/21 10:35:23 rjs Exp $
14 *
15 * in sync with pdflib.h 1.151.2.22
16 *
17 * Wrapper code for the PDFlib Tcl binding
18 *
19 */
20
21 /*
22 * Build with STUBS enabled
23 *
24 * if building with older TCL Versions than 8.2 you have to undef this
25 */
26 #define USE_TCL_STUBS
27
28 #include <tcl.h>
29
30 #include <string.h>
31 #include <stdlib.h>
32
33 #if defined(__WIN32__)
34 # define WIN32_LEAN_AND_MEAN
35 # include <windows.h>
36 # undef WIN32_LEAN_AND_MEAN
37
38 # if defined(__WIN32__) && \
39 (defined(_MSC_VER) || (defined(__GNUC__) && defined(__declspec)))
40 # define SWIGEXPORT(a,b) __declspec(dllexport) a b
41 # else
42 # if defined(__BORLANDC__)
43 # define SWIGEXPORT(a,b) a _export b
44 # else
45 # define SWIGEXPORT(a,b) a b
46 # endif
47 # endif
48 #else
49 # define SWIGEXPORT(a,b) a b
50 #endif
51
52 #include <stdlib.h>
53
54 #ifdef SWIG_GLOBAL
55 #ifdef __cplusplus
56 #define SWIGSTATIC extern "C"
57 #else
58 #define SWIGSTATIC
59 #endif
60 #endif
61
62 #ifndef SWIGSTATIC
63 #define SWIGSTATIC static
64 #endif
65
66 /* SWIG pointer structure */
67
68 typedef struct SwigPtrType {
69 char *name; /* Datatype name */
70 int len; /* Length (used for optimization) */
71 void *(*cast)(void *); /* Pointer casting function */
72 struct SwigPtrType *next; /* Linked list pointer */
73 } SwigPtrType;
74
75 /* Pointer cache structure */
76
77 typedef struct {
78 int stat; /* Status (valid) bit */
79 SwigPtrType *tp; /* Pointer to type structure */
80 char name[256]; /* Given datatype name */
81 char mapped[256]; /* Equivalent name */
82 } SwigCacheType;
83
84 /* Some variables */
85
86 static int SwigPtrMax = 64; /* Max entries that can be currently held */
87 /* This value may be adjusted dynamically */
88 static int SwigPtrN = 0; /* Current number of entries */
89 static int SwigPtrSort = 0; /* Status flag indicating sort */
90 static int SwigStart[256]; /* Starting positions of types */
91
92 /* Pointer table */
93 static SwigPtrType *SwigPtrTable = 0;
94 /* Table containing pointer equivalences */
95
96 /* Cached values */
97
98 #define SWIG_CACHESIZE 8
99 #define SWIG_CACHEMASK 0x7
100 static SwigCacheType SwigCache[SWIG_CACHESIZE];
101 static int SwigCacheIndex = 0;
102 static int SwigLastCache = 0;
103
104 /* Sort comparison function */
swigsort(const void * data1,const void * data2)105 static int swigsort(const void *data1, const void *data2) {
106 SwigPtrType *d1 = (SwigPtrType *) data1;
107 SwigPtrType *d2 = (SwigPtrType *) data2;
108 return strcmp(d1->name,d2->name);
109 }
110
111 /* Binary Search function */
swigcmp(const void * key,const void * data)112 static int swigcmp(const void *key, const void *data) {
113 char *k = (char *) key;
114 SwigPtrType *d = (SwigPtrType *) data;
115 return strncmp(k,d->name,d->len);
116 }
117
118 /* Register a new datatype with the type-checker */
119
120 SWIGSTATIC
SWIG_RegisterMapping(char * origtype,char * newtype,void * (* cast)(void *))121 void SWIG_RegisterMapping(char *origtype, char *newtype, void *(*cast)(void *))
122 {
123
124 int i;
125 SwigPtrType *t = 0,*t1;
126
127 /* Allocate the pointer table if necessary */
128
129 if (!SwigPtrTable) {
130 SwigPtrTable = (SwigPtrType *) malloc(SwigPtrMax*sizeof(SwigPtrType));
131 SwigPtrN = 0;
132 }
133 /* Grow the table */
134 if (SwigPtrN >= SwigPtrMax) {
135 SwigPtrMax = 2*SwigPtrMax;
136 SwigPtrTable = (SwigPtrType *)
137 realloc((char *) SwigPtrTable,SwigPtrMax*sizeof(SwigPtrType));
138 }
139 for (i = 0; i < SwigPtrN; i++)
140 if (strcmp(SwigPtrTable[i].name,origtype) == 0) {
141 t = &SwigPtrTable[i];
142 break;
143 }
144 if (!t) {
145 t = &SwigPtrTable[SwigPtrN];
146 t->name = origtype;
147 t->len = strlen(t->name);
148 t->cast = 0;
149 t->next = 0;
150 SwigPtrN++;
151 }
152
153 /* Check for existing entry */
154
155 while (t->next) {
156 if ((strcmp(t->name,newtype) == 0)) {
157 if (cast) t->cast = cast;
158 return;
159 }
160 t = t->next;
161 }
162
163 /* Now place entry (in sorted order) */
164
165 t1 = (SwigPtrType *) malloc(sizeof(SwigPtrType));
166 t1->name = newtype;
167 t1->len = strlen(t1->name);
168 t1->cast = cast;
169 t1->next = 0;
170 t->next = t1;
171 SwigPtrSort = 0;
172 }
173
174 /* Make a pointer value string */
175
176 SWIGSTATIC
SWIG_MakePtr(char * _c,const void * _ptr,char * type)177 void SWIG_MakePtr(char *_c, const void *_ptr, char *type) {
178 static char _hex[16] =
179 {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
180 'a', 'b', 'c', 'd', 'e', 'f'};
181 unsigned long _p, _s;
182 char _result[20], *_r; /* Note : a 64-bit hex number = 16 digits */
183 _r = _result;
184 _p = (unsigned long) _ptr;
185 if (_p > 0) {
186 while (_p > 0) {
187 _s = _p & 0xf;
188 *(_r++) = _hex[_s];
189 _p = _p >> 4;
190 }
191 *_r = '_';
192 while (_r >= _result)
193 *(_c++) = *(_r--);
194 } else {
195 strcpy (_c, "NULL");
196 }
197 if (_ptr)
198 strcpy (_c, type);
199 }
200
201 /* Function for getting a pointer value */
202
203 SWIGSTATIC
SWIG_GetPtr(char * _c,void ** ptr,char * _t)204 char *SWIG_GetPtr(char *_c, void **ptr, char *_t)
205 {
206 unsigned long _p;
207 char temp_type[256];
208 char *name;
209 int i, len;
210 SwigPtrType *sp,*tp;
211 SwigCacheType *cache;
212 int start, end;
213 _p = 0;
214
215 /* Pointer values must start with leading underscore */
216 if (*_c == '_') {
217 _c++;
218 /* Extract hex value from pointer */
219 while (*_c) {
220 if ((*_c >= '0') && (*_c <= '9'))
221 _p = (_p << 4) + (*_c - '0');
222 else if ((*_c >= 'a') && (*_c <= 'f'))
223 _p = (_p << 4) + ((*_c - 'a') + 10);
224 else
225 break;
226 _c++;
227 }
228
229 if (_t) {
230 if (strcmp(_t,_c)) {
231 if (!SwigPtrSort) {
232 qsort((void *) SwigPtrTable, SwigPtrN, sizeof(SwigPtrType),
233 swigsort);
234 for (i = 0; i < 256; i++) {
235 SwigStart[i] = SwigPtrN;
236 }
237 for (i = SwigPtrN-1; i >= 0; i--) {
238 SwigStart[(int) (SwigPtrTable[i].name[1])] = i;
239 }
240 for (i = 255; i >= 1; i--) {
241 if (SwigStart[i-1] > SwigStart[i])
242 SwigStart[i-1] = SwigStart[i];
243 }
244 SwigPtrSort = 1;
245 for (i = 0; i < SWIG_CACHESIZE; i++)
246 SwigCache[i].stat = 0;
247 }
248
249 /* First check cache for matches.
250 * Uses last cache value as starting point */
251 cache = &SwigCache[SwigLastCache];
252 for (i = 0; i < SWIG_CACHESIZE; i++) {
253 if (cache->stat) {
254 if (strcmp(_t,cache->name) == 0) {
255 if (strcmp(_c,cache->mapped) == 0) {
256 cache->stat++;
257 *ptr = (void *) _p;
258 if (cache->tp->cast) *ptr = (*(cache->tp->cast))(*ptr);
259 return (char *) 0;
260 }
261 }
262 }
263 SwigLastCache = (SwigLastCache+1) & SWIG_CACHEMASK;
264 if (!SwigLastCache) cache = SwigCache;
265 else cache++;
266 }
267 /* We have a type mismatch. Will have to look through our type
268 * mapping table to figure out whether or not we can accept this
269 * datatype */
270
271 start = SwigStart[(int) _t[1]];
272 end = SwigStart[(int) _t[1]+1];
273 sp = &SwigPtrTable[start];
274 while (start < end) {
275 if (swigcmp(_t,sp) == 0) break;
276 sp++;
277 start++;
278 }
279 if (start >= end) sp = 0;
280 /* Try to find a match for this */
281 if (sp) {
282 while (swigcmp(_t,sp) == 0) {
283 name = sp->name;
284 len = sp->len;
285 tp = sp->next;
286 /* Try to find entry for our given datatype */
287 while(tp) {
288 if (tp->len >= 255) {
289 return _c;
290 }
291 strcpy(temp_type,tp->name);
292 strncat(temp_type,_t+len,255-tp->len);
293 if (strcmp(_c,temp_type) == 0) {
294
295 strcpy(SwigCache[SwigCacheIndex].mapped,_c);
296 strcpy(SwigCache[SwigCacheIndex].name,_t);
297 SwigCache[SwigCacheIndex].stat = 1;
298 SwigCache[SwigCacheIndex].tp = tp;
299 SwigCacheIndex = SwigCacheIndex & SWIG_CACHEMASK;
300
301 /* Get pointer value */
302 *ptr = (void *) _p;
303 if (tp->cast) *ptr = (*(tp->cast))(*ptr);
304 return (char *) 0;
305 }
306 tp = tp->next;
307 }
308 sp++;
309 /* Hmmm. Didn't find it this time */
310 }
311 }
312 /* Didn't find any sort of match for this data.
313 Get the pointer value and return the received type */
314 *ptr = (void *) _p;
315 return _c;
316 } else {
317 /* Found a match on the first try. Return pointer value */
318 *ptr = (void *) _p;
319 return (char *) 0;
320 }
321 } else {
322 /* No type specified. Good luck */
323 *ptr = (void *) _p;
324 return (char *) 0;
325 }
326 } else {
327 if (strcmp (_c, "NULL") == 0) {
328 *ptr = (void *) 0;
329 return (char *) 0;
330 }
331 *ptr = (void *) 0;
332 return _c;
333 }
334 }
335
336 #ifdef __cplusplus
337 extern "C" {
338 #endif
339 SWIGEXPORT(int,Pdflib_Init)(Tcl_Interp *);
340 SWIGEXPORT(int,Pdflib_SafeInit)(Tcl_Interp *);
341 SWIGEXPORT(int,Pdflib_tcl_SafeInit)(Tcl_Interp *);
342 SWIGEXPORT(int,Pdflib_tcl_Init)(Tcl_Interp *);
343 SWIGEXPORT(int,Pdf_tcl_Init)(Tcl_Interp *);
344 SWIGEXPORT(int,Pdf_tcl_SafeInit)(Tcl_Interp *);
345 #ifdef __cplusplus
346 }
347 #endif
348
349 #include <setjmp.h>
350
351 #if _MSC_VER >= 1310 /* VS .NET 2003 and later */
352 /* pdflib.h declares some functions as deprecated, but we don't want to see
353 * these warnings here */
354 #pragma warning(disable: 4995)
355 #endif
356
357 #include "pdflib.h"
358
359 /* Exception handling */
360
361 #define try PDF_TRY(p)
362 #define catch PDF_CATCH(p) {\
363 char errmsg[1024];\
364 sprintf(errmsg, "PDFlib Error [%d] %s: %s", PDF_get_errnum(p),\
365 PDF_get_apiname(p), PDF_get_errmsg(p));\
366 Tcl_SetResult(interp, errmsg, TCL_STATIC);\
367 return TCL_ERROR; \
368 }
369
370
371 /*
372 * String handling
373 */
374
375 #define PDF_0BYTES 0
376 #define PDF_BYTES 1
377 #define PDF_UTF8 2
378 #define PDF_UTF16 3
379 #define PDF_0UTF16 4
380 #define PDF_DATA 5
381
382 static const char *
PDF_GetStringFromObj(PDF * p,Tcl_Interp * interp,Tcl_Obj * objPtr,int key,int * len)383 PDF_GetStringFromObj(PDF *p, Tcl_Interp *interp, Tcl_Obj *objPtr, int key,
384 int *len)
385 {
386 Tcl_UniChar *unistring = NULL;
387
388 *len = 0;
389
390 if (objPtr != NULL)
391 {
392 switch (key)
393 {
394 case PDF_DATA:
395 return (const char *) Tcl_GetByteArrayFromObj(objPtr, len);
396
397 case PDF_0BYTES:
398 case PDF_BYTES:
399 return (const char *) Tcl_GetStringFromObj(objPtr, len);
400
401 case PDF_UTF8:
402 case PDF_UTF16:
403 case PDF_0UTF16:
404 unistring = Tcl_GetUnicode(objPtr);
405 if (unistring)
406 {
407 *len = 2 * Tcl_UniCharLen(unistring);
408 if (key == PDF_UTF8)
409 return PDF_utf16_to_utf8(p, (char *) unistring, *len, len);
410 return (const char *) unistring;
411 }
412 }
413 }
414
415 return NULL;
416 }
417
418 static void
PDF_WrongCommand(Tcl_Interp * interp,const char * vartext)419 PDF_WrongCommand(Tcl_Interp *interp, const char *vartext)
420 {
421 char text[128];
422
423 sprintf(text, "Wrong # args. %s", vartext);
424 Tcl_SetResult(interp, text, TCL_STATIC);
425 }
426
427 static void
PDF_NoPDFHandle(Tcl_Interp * interp,const char * vartext)428 PDF_NoPDFHandle(Tcl_Interp *interp, const char *vartext)
429 {
430 char text[128];
431
432 sprintf(text, "Couldn't retrieve PDF handle in %s", vartext);
433 Tcl_SetResult(interp, text, TCL_STATIC);
434 }
435
436 static void
PDF_WrongPDFHandle(Tcl_Interp * interp,const char * vartext)437 PDF_WrongPDFHandle(Tcl_Interp *interp, const char *vartext)
438 {
439 char text[128];
440
441 sprintf(text, "Wrong PDF handle in %s", vartext);
442 Tcl_SetResult(interp, text, TCL_STATIC);
443 }
444
445 static void
PDF_WrongParameter(Tcl_Interp * interp,const char * vartext)446 PDF_WrongParameter(Tcl_Interp *interp, const char *vartext)
447 {
448 char text[128];
449
450 sprintf(text, "Wrong parameter %s", vartext);
451 Tcl_SetResult(interp, text, TCL_STATIC);
452 }
453
454 static int
_wrap_PDF_open_pdi(ClientData clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])455 _wrap_PDF_open_pdi(ClientData clientData, Tcl_Interp *interp, int objc,
456 Tcl_Obj *CONST objv[])
457 {
458 PDF *p;
459 const char *filename;
460 int filename_len;
461 const char *optlist;
462 int optlist_len;
463 char *res;
464 int volatile _result = -1;
465
466 if (objc != 4 && objc != 5) /* downward compatibility */
467 {
468 PDF_WrongCommand(interp, "PDF_open_pdi p filename optlist ");
469 return TCL_ERROR;
470 }
471
472 if ((res = Tcl_GetStringFromObj(objv[1], NULL)) == NULL)
473 {
474 PDF_NoPDFHandle(interp, "PDF_open_pdi");
475 return TCL_ERROR;
476 }
477
478 if (SWIG_GetPtr(res, (void **) &p, "_PDF_p"))
479 {
480 PDF_WrongPDFHandle(interp, "PDF_open_pdi");
481 Tcl_AppendResult(interp, res, (char *) NULL);
482 return TCL_ERROR;
483 }
484
485 if ((filename = PDF_GetStringFromObj(p, interp, objv[2], PDF_0UTF16,
486 &filename_len)) == NULL)
487 {
488 PDF_WrongParameter(interp, "filename in PDF_open_pdi");
489 return TCL_ERROR;
490 }
491
492 if ((optlist = PDF_GetStringFromObj(p, interp, objv[3], PDF_UTF8,
493 &optlist_len)) == NULL)
494 {
495 PDF_WrongParameter(interp, "optlist in PDF_open_pdi");
496 return TCL_ERROR;
497 }
498
499 try { _result = (int) PDF_open_pdi(p, filename, optlist, filename_len);
500 } catch;
501
502 sprintf(interp->result, "%d", _result);
503 return TCL_OK;
504 }
505
506 static int
_wrap_PDF_delete(ClientData clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])507 _wrap_PDF_delete(ClientData clientData, Tcl_Interp *interp, int objc,
508 Tcl_Obj *CONST objv[])
509 {
510 PDF *p;
511 char *res;
512
513 if (objc != 2)
514 {
515 PDF_WrongCommand(interp, "PDF_delete p ");
516 return TCL_ERROR;
517 }
518
519 if ((res = Tcl_GetStringFromObj(objv[1], NULL)) == NULL)
520 {
521 PDF_NoPDFHandle(interp, "PDF_delete");
522 return TCL_ERROR;
523 }
524
525 if (SWIG_GetPtr(res, (void **) &p, "_PDF_p"))
526 {
527 PDF_WrongPDFHandle(interp, "PDF_delete");
528 Tcl_AppendResult(interp, res, (char *) NULL);
529 return TCL_ERROR;
530 }
531
532 PDF_delete(p);
533
534 return TCL_OK;
535 }
536
537 static int
_wrap_PDF_new(ClientData clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])538 _wrap_PDF_new(ClientData clientData, Tcl_Interp *interp, int objc,
539 Tcl_Obj *CONST objv[])
540 {
541 PDF *p;
542
543 if (objc != 1)
544 {
545 PDF_WrongCommand(interp, "PDF_new ");
546 return TCL_ERROR;
547 }
548
549 p = (PDF *) PDF_new();
550 if (p != NULL)
551 {
552 int major, minor, type, patchlevel;
553 char versionbuf[32];
554
555 Tcl_GetVersion(&major, &minor, &patchlevel, &type);
556 sprintf(versionbuf, "Tcl %d.%d%c%d", major, minor,
557 "ab."[type], patchlevel);
558
559 PDF_set_parameter(p, "binding", versionbuf);
560 PDF_set_parameter(p, "unicaplang", "true");
561 PDF_set_parameter(p, "textformat", "auto2");
562 PDF_set_parameter(p, "hypertextformat", "auto2");
563 PDF_set_parameter(p, "hypertextencoding", "");
564
565 SWIG_MakePtr(interp->result, (void *) p, "_PDF_p");
566 }
567 else
568 {
569 Tcl_SetResult(interp, "Couldn't create PDF handle", TCL_STATIC);
570 }
571
572 return TCL_OK;
573 }
574
575 static int
_wrap_PDF_open_image(ClientData clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])576 _wrap_PDF_open_image(ClientData clientData, Tcl_Interp *interp, int objc,
577 Tcl_Obj *CONST objv[])
578 {
579 PDF *p;
580 const char *imagetype;
581 int imagetype_len;
582 const char *source;
583 int source_len;
584 const char *data;
585 int data_len;
586 long length;
587 int width;
588 int height;
589 int components;
590 int bpc;
591 const char *params;
592 int params_len;
593 char *res;
594 int volatile _result = -1;
595
596 if (objc != 11)
597 {
598 PDF_WrongCommand(interp, "PDF_open_image p imagetype source "
599 "data length width height components bpc params ");
600 return TCL_ERROR;
601 }
602
603 if ((res = Tcl_GetStringFromObj(objv[1], NULL)) == NULL)
604 {
605 PDF_NoPDFHandle(interp, "PDF_open_image");
606 return TCL_ERROR;
607 }
608
609 if (SWIG_GetPtr(res, (void **) &p, "_PDF_p"))
610 {
611 PDF_WrongPDFHandle(interp, "PDF_open_image");
612 Tcl_AppendResult(interp, res, (char *) NULL);
613 return TCL_ERROR;
614 }
615
616 if ((imagetype = PDF_GetStringFromObj(p, interp, objv[2], PDF_BYTES,
617 &imagetype_len)) == NULL)
618 {
619 PDF_WrongParameter(interp, "imagetype in PDF_open_image");
620 return TCL_ERROR;
621 }
622
623 if ((source = PDF_GetStringFromObj(p, interp, objv[3], PDF_BYTES,
624 &source_len)) == NULL)
625 {
626 PDF_WrongParameter(interp, "source in PDF_open_image");
627 return TCL_ERROR;
628 }
629
630 if ((data = Tcl_GetByteArrayFromObj(objv[4], &data_len)) == NULL)
631 {
632 PDF_WrongParameter(interp, "data in PDF_open_image");
633 return TCL_ERROR;
634 }
635
636 if (Tcl_GetLongFromObj(interp, objv[5], &length) != TCL_OK)
637 {
638 PDF_WrongParameter(interp, "length in PDF_open_image");
639 return TCL_ERROR;
640 }
641
642 if (Tcl_GetIntFromObj(interp, objv[6], &width) != TCL_OK)
643 {
644 PDF_WrongParameter(interp, "width in PDF_open_image");
645 return TCL_ERROR;
646 }
647
648 if (Tcl_GetIntFromObj(interp, objv[7], &height) != TCL_OK)
649 {
650 PDF_WrongParameter(interp, "height in PDF_open_image");
651 return TCL_ERROR;
652 }
653
654 if (Tcl_GetIntFromObj(interp, objv[8], &components) != TCL_OK)
655 {
656 PDF_WrongParameter(interp, "components in PDF_open_image");
657 return TCL_ERROR;
658 }
659
660 if (Tcl_GetIntFromObj(interp, objv[9], &bpc) != TCL_OK)
661 {
662 PDF_WrongParameter(interp, "bpc in PDF_open_image");
663 return TCL_ERROR;
664 }
665
666 if ((params = PDF_GetStringFromObj(p, interp, objv[10], PDF_BYTES,
667 ¶ms_len)) == NULL)
668 {
669 PDF_WrongParameter(interp, "params in PDF_open_image");
670 return TCL_ERROR;
671 }
672
673 try { _result = (int) PDF_open_image(p, imagetype, source, data,
674 length, width, height, components, bpc, params);
675 } catch;
676
677 sprintf(interp->result, "%d", _result);
678 return TCL_OK;
679 }
680
681 static int
_wrap_PDF_setpolydash(ClientData clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])682 _wrap_PDF_setpolydash(ClientData clientData, Tcl_Interp *interp, int objc,
683 Tcl_Obj *CONST objv[])
684 {
685 PDF *p;
686 float *dasharray;
687 int length;
688 char *res;
689 float *carray;
690 double dval;
691 int i;
692 Tcl_Obj *val;
693
694 if (objc != 3)
695 {
696 PDF_WrongCommand(interp, "PDF_setpolydash p dasharray ");
697 return TCL_ERROR;
698 }
699
700 if ((res = Tcl_GetStringFromObj(objv[1], NULL)) == NULL)
701 {
702 PDF_NoPDFHandle(interp, "PDF_setpolydash");
703 return TCL_ERROR;
704 }
705
706 if (SWIG_GetPtr(res, (void **) &p, "_PDF_p"))
707 {
708 PDF_WrongPDFHandle(interp, "PDF_setpolydash");
709 Tcl_AppendResult(interp, res, (char *) NULL);
710 return TCL_ERROR;
711 }
712
713 if (Tcl_ListObjLength(interp, objv[2], &length) != TCL_OK) {
714 PDF_WrongParameter(interp, "length in PDF_setpolydash");
715 return TCL_ERROR;
716 }
717
718 carray = (float *) malloc(sizeof(float) * length);
719 if (carray == NULL)
720 {
721 Tcl_SetResult(interp, "Out of memory in PDF_setpolydash", TCL_STATIC);
722 return TCL_ERROR;
723 }
724
725 for (i = 0; i < length; i++)
726 {
727 if (Tcl_ListObjIndex(interp, objv[2], i, &val) != TCL_OK ||
728 Tcl_GetDoubleFromObj(interp, val, &dval) != TCL_OK)
729 {
730 PDF_WrongParameter(interp, "array value in PDF_setpolydash");
731 return TCL_ERROR;
732 }
733 carray[i] = (float) dval;
734 }
735
736 try { PDF_setpolydash(p, carray, length);
737 } catch;
738
739 free(carray);
740
741 return TCL_OK;
742 }
743
744
745 static int
_wrap_PDF_show_boxed(ClientData clientData,Tcl_Interp * interp,int objc,Tcl_Obj * CONST objv[])746 _wrap_PDF_show_boxed(ClientData clientData, Tcl_Interp *interp,
747 int objc, Tcl_Obj *CONST objv[])
748 {
749 PDF *p;
750 char *pdf;
751 const char * text = NULL;
752 int text_len;
753 double left;
754 double top;
755 double width;
756 double height;
757 const char * hmode = NULL;
758 int hmode_len;
759 const char * feature = NULL;
760 int feature_len;
761 int volatile _retval = -1;
762
763 if (objc != 9)
764 {
765 PDF_WrongCommand(interp,
766 "PDF_show_boxed p text left top width height hmode feature");
767 return TCL_ERROR;
768 }
769
770 if ((pdf = Tcl_GetStringFromObj(objv[1], NULL)) == NULL)
771 {
772 PDF_NoPDFHandle(interp, "PDF_show_boxed");
773 return TCL_ERROR;
774 }
775
776 if (SWIG_GetPtr(pdf, (void **) &p, "_PDF_p"))
777 {
778 PDF_WrongPDFHandle(interp, "PDF_show_boxed");
779 Tcl_AppendResult(interp, pdf, (char *) NULL);
780 return TCL_ERROR;
781 }
782 if ((text = PDF_GetStringFromObj(p, interp, objv[2], PDF_UTF16, &text_len))
783 == NULL)
784 {
785 PDF_WrongParameter(interp, "text in PDF_show_boxed");
786 return TCL_ERROR;
787 }
788 if (Tcl_GetDoubleFromObj(interp, objv[3], &left) != TCL_OK)
789 {
790 PDF_WrongParameter(interp, "left in PDF_show_boxed");
791 return TCL_ERROR;
792 }
793 if (Tcl_GetDoubleFromObj(interp, objv[4], &top) != TCL_OK)
794 {
795 PDF_WrongParameter(interp, "top in PDF_show_boxed");
796 return TCL_ERROR;
797 }
798 if (Tcl_GetDoubleFromObj(interp, objv[5], &width) != TCL_OK)
799 {
800 PDF_WrongParameter(interp, "width in PDF_show_boxed");
801 return TCL_ERROR;
802 }
803 if (Tcl_GetDoubleFromObj(interp, objv[6], &height) != TCL_OK)
804 {
805 PDF_WrongParameter(interp, "height in PDF_show_boxed");
806 return TCL_ERROR;
807 }
808 if ((hmode = PDF_GetStringFromObj(p, interp, objv[7], PDF_BYTES,
809 &hmode_len)) == NULL)
810 {
811 PDF_WrongParameter(interp, "hmode in PDF_show_boxed");
812 return TCL_ERROR;
813 }
814 if ((feature = PDF_GetStringFromObj(p, interp, objv[8], PDF_BYTES,
815 &feature_len)) == NULL)
816 {
817 PDF_WrongParameter(interp, "feature in PDF_show_boxed");
818 return TCL_ERROR;
819 }
820
821 try {
822 _retval = PDF_show_boxed2(p, text, text_len, left, top, width, height,
823 hmode, feature);
824 } catch;
825
826 sprintf(interp->result, "%d", _retval);
827
828 return TCL_OK;
829 }
830
831
832
833 #define _WRAP_CODE
834 #include "tcl_wrapped.c"
835 #undef _WRAP_CODE
836
837
838 /* This is required to make our extension work with safe Tcl interpreters */
SWIGEXPORT(int,Pdflib_SafeInit)839 SWIGEXPORT(int,Pdflib_SafeInit)(Tcl_Interp *interp)
840 {
841 return TCL_OK;
842 }
843
844 /* This is required to satisfy pkg_mkIndex */
SWIGEXPORT(int,Pdflib_tcl_SafeInit)845 SWIGEXPORT(int,Pdflib_tcl_SafeInit)(Tcl_Interp *interp)
846 {
847 return Pdflib_SafeInit(interp);
848 }
849
850 /* This is required to satisfy pkg_mkIndex */
SWIGEXPORT(int,Pdflib_tcl_Init)851 SWIGEXPORT(int,Pdflib_tcl_Init)(Tcl_Interp *interp)
852 {
853 return Pdflib_Init(interp);
854 }
855
856 /* This is required to satisfy pkg_mkIndex */
SWIGEXPORT(int,Pdf_tcl_Init)857 SWIGEXPORT(int,Pdf_tcl_Init)(Tcl_Interp *interp)
858 {
859 return Pdflib_Init(interp);
860 }
861
862 /* This is required to satisfy pkg_mkIndex */
SWIGEXPORT(int,Pdf_tcl_SafeInit)863 SWIGEXPORT(int,Pdf_tcl_SafeInit)(Tcl_Interp *interp)
864 {
865 return Pdflib_SafeInit(interp);
866 }
867
SWIGEXPORT(int,Pdflib_Init)868 SWIGEXPORT(int,Pdflib_Init)(Tcl_Interp *interp)
869 {
870 char short_version[6];
871
872 strncpy(short_version, PDFLIB_VERSIONSTRING, 5);
873 short_version[5] = 0;
874
875 if (interp == 0)
876 return TCL_ERROR;
877
878 #ifdef USE_TCL_STUBS
879 if (Tcl_InitStubs(interp, "8.2", 0) == NULL) {
880 return TCL_ERROR;
881 }
882 #else
883 if (Tcl_PkgRequire(interp, "Tcl", TCL_VERSION, 1) == NULL) {
884 return TCL_ERROR;
885 }
886 #endif
887
888 /* Tell Tcl which package we are going to define */
889 Tcl_PkgProvide(interp, "pdflib", short_version);
890
891 Tcl_CreateObjCommand(interp, "PDF_open_pdi",
892 (Tcl_ObjCmdProc*) _wrap_PDF_open_pdi,
893 (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
894
895 Tcl_CreateObjCommand(interp, "PDF_show_boxed", (Tcl_ObjCmdProc*)
896 _wrap_PDF_show_boxed, (ClientData) NULL, (Tcl_CmdDeleteProc *) NULL);
897
898 #define _WRAP_METHODS
899 #include "tcl_wrapped.c"
900 #undef _WRAP_METHODS
901
902
903 /*
904 * These are the pointer type-equivalency mappings.
905 * (Used by the SWIG pointer type-checker).
906 */
907 SWIG_RegisterMapping("_signed_long","_long",0);
908 SWIG_RegisterMapping("_struct_PDF_s","_PDF",0);
909 SWIG_RegisterMapping("_long","_unsigned_long",0);
910 SWIG_RegisterMapping("_long","_signed_long",0);
911 SWIG_RegisterMapping("_PDF","_struct_PDF_s",0);
912 SWIG_RegisterMapping("_unsigned_long","_long",0);
913 SWIG_RegisterMapping("_signed_int","_int",0);
914 SWIG_RegisterMapping("_unsigned_short","_short",0);
915 SWIG_RegisterMapping("_signed_short","_short",0);
916 SWIG_RegisterMapping("_unsigned_int","_int",0);
917 SWIG_RegisterMapping("_short","_unsigned_short",0);
918 SWIG_RegisterMapping("_short","_signed_short",0);
919 SWIG_RegisterMapping("_int","_unsigned_int",0);
920 SWIG_RegisterMapping("_int","_signed_int",0);
921 return TCL_OK;
922 }
923