Commit | Line | Data |
a0d0e21e |
1 | /* dlutils.c - handy functions and definitions for dl_*.xs files |
2 | * |
3 | * Currently this file is simply #included into dl_*.xs/.c files. |
4 | * It should really be split into a dlutils.h and dlutils.c |
5 | * |
6 | */ |
7 | |
8 | |
9 | /* pointer to allocated memory for last error message */ |
10 | static char *LastError = (char*)NULL; |
11 | |
12 | |
13 | |
14 | #ifdef DEBUGGING |
15 | /* currently not connected to $DynaLoader::dl_error but should be */ |
16 | static int dl_debug = 0; |
17 | #define DLDEBUG(level,code) if(dl_debug>=level){ code; } |
18 | #else |
19 | #define DLDEBUG(level,code) |
20 | #endif |
21 | |
22 | |
23 | static void |
24 | dl_generic_private_init() /* called by dl_*.xs dl_private_init() */ |
25 | { |
26 | #ifdef DEBUGGING |
27 | char *perl_dl_debug = getenv("PERL_DL_DEBUG"); |
28 | if (perl_dl_debug) |
29 | dl_debug = atoi(perl_dl_debug); |
30 | #endif |
31 | } |
32 | |
33 | |
34 | /* SaveError() takes printf style args and saves the result in LastError */ |
35 | #ifdef STANDARD_C |
36 | static void |
37 | SaveError(char* pat, ...) |
38 | #else |
39 | /*VARARGS0*/ |
40 | static void |
41 | SaveError(pat, va_alist) |
42 | char *pat; |
43 | va_dcl |
44 | #endif |
45 | { |
46 | va_list args; |
47 | char *message; |
48 | int len; |
49 | |
50 | /* This code is based on croak/warn but I'm not sure where mess() */ |
51 | /* gets its buffer space from! */ |
52 | |
53 | #ifdef I_STDARG |
54 | va_start(args, pat); |
55 | #else |
56 | va_start(args); |
57 | #endif |
58 | message = mess(pat, &args); |
59 | va_end(args); |
60 | |
61 | len = strlen(message) + 1 ; /* include terminating null char */ |
62 | |
63 | /* Allocate some memory for the error message */ |
64 | if (LastError) |
65 | LastError = (char*)saferealloc(LastError, len) ; |
66 | else |
67 | LastError = safemalloc(len) ; |
68 | |
69 | /* Copy message into LastError (including terminating null char) */ |
70 | strncpy(LastError, message, len) ; |
71 | DLDEBUG(2,fprintf(stderr,"DynaLoader: stored error msg '%s'\n",LastError)); |
72 | } |
73 | |
74 | |
75 | /* prepend underscore to s. write into buf. return buf. */ |
76 | char * |
77 | dl_add_underscore(s, buf) |
78 | char *s; |
79 | char *buf; |
80 | { |
81 | *buf = '_'; |
82 | (void)strcpy(buf + 1, s); |
83 | return buf; |
84 | } |
85 | |