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                         &params_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