WIP, it compiles
[imager.git] / context.c
1 #include "imageri.h"
2
3 /*
4 =item im_context_new()
5
6 Create a new Imager context object.
7
8 =cut
9 */
10
11 im_context_t
12 im_context_new(void) {
13   im_context_t ctx = mymalloc(sizeof(im_context_struct));
14   int i;
15
16   ctx->error_sp = IM_ERROR_COUNT-1;
17   for (i = 0; i < IM_ERROR_COUNT; ++i) {
18     ctx->error_alloc[i] = 0;
19     ctx->error_stack[i].msg = NULL;
20     ctx->error_stack[i].code = 0;
21   }
22 #ifdef IMAGER_LOG
23   ctx->log_level = 0;
24   ctx->lg_file = NULL;
25 #endif
26   ctx->max_width = 0;
27   ctx->max_height = 0;
28   ctx->max_bytes = 0;
29
30   return ctx;
31 }
32
33 /*
34 =item im_context_delete(ctx)
35
36 Release memory used by an Imager context object.
37
38 =cut
39 */
40
41 void
42 im_context_delete(im_context_t ctx) {
43   int i;
44
45   for (i = 0; i < IM_ERROR_COUNT; ++i) {
46     if (ctx->error_stack[i].msg)
47       myfree(ctx->error_stack[i].msg);
48   }
49 #ifdef IMAGER_LOG
50   if (ctx->lg_file)
51     fclose(ctx->lg_file);
52 #endif
53 }
54
55 /*
56 =item im_context_clone(ctx)
57
58 Clone an Imager context object, returning the result.
59
60 =cut
61 */
62
63 im_context_t
64 im_context_clone(im_context_t ctx) {
65   im_context_t nctx = mymalloc(sizeof(im_context_struct));
66   int i;
67
68   nctx->error_sp = ctx->error_sp;
69   for (i = 0; i < IM_ERROR_COUNT; ++i) {
70     if (ctx->error_stack[i].msg) {
71       size_t sz = ctx->error_alloc[i];
72       nctx->error_alloc[i] = sz;
73       nctx->error_stack[i].msg = mymalloc(sz);
74       memcpy(nctx->error_stack[i].msg, ctx->error_stack[i].msg, sz);
75     }
76     else {
77       nctx->error_alloc[i] = 0;
78       nctx->error_stack[i].msg = NULL;
79     }
80     nctx->error_stack[i].code = ctx->error_stack[i].code;
81   }
82 #ifdef IMAGER_LOG
83   nctx->log_level = ctx->log_level;
84   if (ctx->lg_file) {
85     /* disable buffering, this isn't perfect */
86     setvbuf(ctx->lg_file, NULL, _IONBF, 0);
87
88     /* clone that and disable buffering some more */
89     nctx->lg_file = fdopen(fileno(ctx->lg_file), "a");
90     if (nctx->lg_file)
91       setvbuf(nctx->lg_file, NULL, _IONBF, 0);
92   }
93   else {
94     nctx->lg_file = NULL;
95   }
96 #endif
97   nctx->max_width = ctx->max_width;
98   nctx->max_height = ctx->max_height;
99   nctx->max_bytes = ctx->max_bytes;
100
101   return ctx;
102 }