~ubuntu-branches/ubuntu/maverick/uim/maverick

« back to all changes in this revision

Viewing changes to uim/uim-scm.c

  • Committer: Bazaar Package Importer
  • Author(s): Masahito Omote
  • Date: 2008-05-18 22:18:10 UTC
  • mfrom: (1.1.8 upstream)
  • mto: This revision was merged to the branch mainline in revision 5.
  • Revision ID: james.westby@ubuntu.com-20080518221810-4d2rd0ca18xnu8kc
Tags: 1:1.5.1-1
* New upstream release
* uim-qt3: Add uim inputcontext plugin for Qt3. And due to uim-*-qt are
  not supported in Qt4 for now officially, uim-*-qt are contained in
  this package.
* uim-qt: Depends uim-qt3 because of described above.
* libuim6: New package for syncing with upstream upgrade soversion.
* 05_qmake_bug_workaround.dpatch: patch for the workaround that qmake does
  not add link option against other libraries(e.g. -lX11) by default.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/*
2
 
 
3
 
  Copyright (c) 2003-2008 uim Project http://code.google.com/p/uim/
4
 
 
5
 
  All rights reserved.
6
 
 
7
 
  Redistribution and use in source and binary forms, with or without
8
 
  modification, are permitted provided that the following conditions
9
 
  are met:
10
 
 
11
 
  1. Redistributions of source code must retain the above copyright
12
 
     notice, this list of conditions and the following disclaimer.
13
 
  2. Redistributions in binary form must reproduce the above copyright
14
 
     notice, this list of conditions and the following disclaimer in the
15
 
     documentation and/or other materials provided with the distribution.
16
 
  3. Neither the name of authors nor the names of its contributors
17
 
     may be used to endorse or promote products derived from this software
18
 
     without specific prior written permission.
19
 
 
20
 
  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
21
 
  ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
 
  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
 
  ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
24
 
  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
 
  DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26
 
  OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
 
  HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
 
  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
 
  OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30
 
  SUCH DAMAGE.
31
 
 
32
 
*/
33
 
 
34
 
/*
35
 
 * To avoid namespace pollution, all SigScheme functions and variables
36
 
 * are defined as static and wrapped into uim-scm.c by direct
37
 
 * inclusion instead of being linked via public symbols.
38
 
 *   -- YamaKen 2004-12-21, 2005-01-10, 2006-04-02
39
 
 */
40
 
/* This file must be included before uim's config.h */
41
 
#include "sigscheme-combined.c"
42
 
#if !SSCM_VERSION_REQUIRE(0, 7, 5)
43
 
#error "SigScheme version 0.7.5 or later is required"
44
 
#endif
45
 
 
46
 
#include <config.h>
47
 
 
48
 
#include <stdio.h>
49
 
#include <stdlib.h>
50
 
#include <string.h>
51
 
#include <ctype.h>
52
 
 
53
 
#include "uim-stdint.h"
54
 
#include "uim-scm.h"
55
 
#include "uim-compat-scm.h"
56
 
#include "uim-internal.h"
57
 
 
58
 
 
59
 
#ifdef UIM_COMPAT_SCM
60
 
#include "uim-compat-scm.c"
61
 
#endif
62
 
 
63
 
/* FIXME: illegal internal access */
64
 
#define scm_out SCM_GLOBAL_VAR(port, scm_out)
65
 
#define scm_err SCM_GLOBAL_VAR(port, scm_err)
66
 
 
67
 
static void uim_scm_error(const char *msg, uim_lisp errobj);
68
 
 
69
 
#if UIM_SCM_GCC4_READY_GC
70
 
struct uim_scm_error_args {
71
 
  const char *msg;
72
 
  uim_lisp errobj;
73
 
};
74
 
static void *uim_scm_error_internal(struct uim_scm_error_args *args);
75
 
 
76
 
static void *uim_scm_c_int_internal(void *uim_lisp_integer);
77
 
static const char *uim_scm_refer_c_str_internal(void *uim_lisp_str);
78
 
static void *uim_scm_eval_internal(void *uim_lisp_obj);
79
 
#endif
80
 
 
81
 
uim_lisp uim_scm_last_val;
82
 
static uim_bool sscm_is_exit_with_fatal_error;
83
 
static FILE *uim_output = NULL;
84
 
 
85
 
static void
86
 
uim_scm_error(const char *msg, uim_lisp errobj)
87
 
#if UIM_SCM_GCC4_READY_GC
88
 
{
89
 
  struct uim_scm_error_args args;
90
 
 
91
 
  args.msg = msg;
92
 
  args.errobj = errobj;
93
 
  uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)uim_scm_error_internal, &args);
94
 
}
95
 
 
96
 
static void *
97
 
uim_scm_error_internal(struct uim_scm_error_args *args)
98
 
{
99
 
  /* FIXME: don't terminate the process */
100
 
  scm_error_obj(NULL, args->msg, (ScmObj)args->errobj);
101
 
  return NULL;
102
 
}
103
 
#else /* UIM_SCM_GCC4_READY_GC */
104
 
static void
105
 
uim_scm_error_internal(const char *msg, uim_lisp errobj)
106
 
{
107
 
  uim_lisp stack_start;
108
 
 
109
 
  uim_scm_gc_protect_stack(&stack_start);
110
 
 
111
 
  /* FIXME: don't terminate the process */
112
 
  scm_error_obj(NULL, msg, (ScmObj)errobj);
113
 
 
114
 
  uim_scm_gc_unprotect_stack(&stack_start);
115
 
}
116
 
#endif /* UIM_SCM_GCC4_READY_GC */
117
 
 
118
 
FILE *
119
 
uim_scm_get_output(void)
120
 
{
121
 
  return uim_output;
122
 
}
123
 
 
124
 
void
125
 
uim_scm_set_output(FILE *fp)
126
 
{
127
 
  uim_output = fp;
128
 
}
129
 
 
130
 
uim_bool
131
 
uim_scm_c_bool(uim_lisp val)
132
 
{
133
 
  return UIM_SCM_NFALSEP(val);
134
 
}
135
 
 
136
 
uim_lisp
137
 
uim_scm_make_bool(uim_bool val)
138
 
{
139
 
  return (val) ? uim_scm_t() : uim_scm_f();
140
 
}
141
 
 
142
 
int
143
 
uim_scm_c_int(uim_lisp integer)
144
 
#if UIM_SCM_GCC4_READY_GC
145
 
{
146
 
  return (int)(intptr_t)uim_scm_call_with_gc_ready_stack(uim_scm_c_int_internal, (void *)integer);
147
 
}
148
 
 
149
 
static void *
150
 
uim_scm_c_int_internal(void *uim_lisp_integer)
151
 
#endif
152
 
{
153
 
  int c_int;
154
 
#if UIM_SCM_GCC4_READY_GC
155
 
  uim_lisp integer;
156
 
#else
157
 
  uim_lisp stack_start;
158
 
#endif
159
 
 
160
 
#if UIM_SCM_GCC4_READY_GC
161
 
  integer = (uim_lisp)uim_lisp_integer;
162
 
#else
163
 
  /* stack protection is required for my_err() */
164
 
  uim_scm_gc_protect_stack(&stack_start);
165
 
#endif
166
 
 
167
 
  if (SCM_INTP((ScmObj)integer)) {
168
 
    c_int = SCM_INT_VALUE((ScmObj)integer);
169
 
  } else {
170
 
    uim_scm_error("uim_scm_c_int: number required but got ",
171
 
                  (uim_lisp)integer);
172
 
    c_int = -1;
173
 
  }
174
 
 
175
 
#if UIM_SCM_GCC4_READY_GC
176
 
  return (void *)(intptr_t)c_int;
177
 
#else
178
 
  uim_scm_gc_unprotect_stack(&stack_start);
179
 
 
180
 
  return c_int;
181
 
#endif
182
 
}
183
 
 
184
 
uim_lisp
185
 
uim_scm_make_int(int integer)
186
 
{
187
 
  return (uim_lisp)SCM_MAKE_INT(integer);
188
 
}
189
 
 
190
 
char *
191
 
uim_scm_c_str(uim_lisp str)
192
 
{
193
 
  const char *c_str;
194
 
 
195
 
  c_str = uim_scm_refer_c_str(str);
196
 
 
197
 
  return (c_str) ? strdup(c_str) : NULL;
198
 
}
199
 
 
200
 
const char *
201
 
uim_scm_refer_c_str(uim_lisp str)
202
 
#if UIM_SCM_GCC4_READY_GC
203
 
{
204
 
  return uim_scm_call_with_gc_ready_stack((uim_gc_gate_func_ptr)uim_scm_refer_c_str_internal, (void *)str);
205
 
}
206
 
 
207
 
static const char *
208
 
uim_scm_refer_c_str_internal(void *uim_lisp_str)
209
 
#endif
210
 
{
211
 
  char *c_str;
212
 
#if UIM_SCM_GCC4_READY_GC
213
 
  uim_lisp str;
214
 
#else
215
 
  uim_lisp stack_start;
216
 
#endif
217
 
 
218
 
#if UIM_SCM_GCC4_READY_GC
219
 
  str = (uim_lisp)uim_lisp_str;
220
 
#else
221
 
  /* stack protection is required for my_err() */
222
 
  uim_scm_gc_protect_stack(&stack_start);
223
 
#endif
224
 
 
225
 
  if (SCM_STRINGP((ScmObj)str)) {
226
 
    c_str = SCM_STRING_STR((ScmObj)str);
227
 
  } else if (SCM_SYMBOLP((ScmObj)str)) {
228
 
    c_str = SCM_SYMBOL_NAME((ScmObj)str);
229
 
  } else {
230
 
    uim_scm_error("uim_scm_refer_c_str: string or symbol required but got ",
231
 
                  (uim_lisp)str);
232
 
    c_str = NULL;
233
 
  }
234
 
 
235
 
#if !UIM_SCM_GCC4_READY_GC
236
 
  uim_scm_gc_unprotect_stack(&stack_start);
237
 
#endif
238
 
 
239
 
  return c_str;
240
 
}
241
 
 
242
 
uim_lisp
243
 
uim_scm_make_str(const char *str)
244
 
{
245
 
  return (uim_lisp)SCM_MAKE_STRING_COPYING(str, SCM_STRLEN_UNKNOWN);
246
 
}
247
 
 
248
 
char *
249
 
uim_scm_c_symbol(uim_lisp symbol)
250
 
{
251
 
  return strdup((char *)SCM_SYMBOL_NAME((ScmObj)symbol));
252
 
}
253
 
 
254
 
uim_lisp
255
 
uim_scm_make_symbol(const char *name)
256
 
{
257
 
  return (uim_lisp)scm_intern(name);
258
 
}
259
 
 
260
 
void *
261
 
uim_scm_c_ptr(uim_lisp ptr)
262
 
{
263
 
  if (SCM_C_POINTERP((ScmObj)ptr)) {
264
 
    return SCM_C_POINTER_VALUE((ScmObj)ptr);
265
 
  } else {
266
 
    uim_scm_error("uim_scm_c_ptr: C pointer required but got ", (uim_lisp)ptr);
267
 
    return NULL;
268
 
  }
269
 
}
270
 
 
271
 
uim_lisp
272
 
uim_scm_make_ptr(void *ptr)
273
 
{
274
 
  return (uim_lisp)SCM_MAKE_C_POINTER(ptr);
275
 
}
276
 
 
277
 
uim_func_ptr
278
 
uim_scm_c_func_ptr(uim_lisp func_ptr)
279
 
{
280
 
  if (SCM_C_FUNCPOINTERP((ScmObj)func_ptr)) {
281
 
    return SCM_C_FUNCPOINTER_VALUE((ScmObj)func_ptr);
282
 
  } else {
283
 
    uim_scm_error("uim_scm_c_func_ptr: C function pointer required but got ",
284
 
                  (uim_lisp)func_ptr);
285
 
    return NULL;
286
 
  }
287
 
}
288
 
 
289
 
uim_lisp
290
 
uim_scm_make_func_ptr(uim_func_ptr func_ptr)
291
 
{
292
 
  return (uim_lisp)SCM_MAKE_C_FUNCPOINTER((ScmCFunc)func_ptr);
293
 
}
294
 
 
295
 
void
296
 
uim_scm_gc_protect(uim_lisp *location)
297
 
{
298
 
  scm_gc_protect((ScmObj *)location);
299
 
}
300
 
 
301
 
#if UIM_SCM_GCC4_READY_GC
302
 
void
303
 
uim_scm_gc_unprotect(uim_lisp *location)
304
 
{
305
 
  scm_gc_unprotect((ScmObj *)location);
306
 
}
307
 
 
308
 
void *
309
 
uim_scm_call_with_gc_ready_stack(uim_gc_gate_func_ptr func, void *arg)
310
 
{
311
 
  return scm_call_with_gc_ready_stack(func, arg);
312
 
}
313
 
#else
314
 
void
315
 
uim_scm_gc_unprotect_stack(uim_lisp *stack_start)
316
 
{
317
 
  scm_gc_unprotect_stack((ScmObj*)stack_start);
318
 
}
319
 
 
320
 
void
321
 
uim_scm_gc_protect_stack(uim_lisp *stack_start)
322
 
{
323
 
  scm_gc_protect_stack((ScmObj*)stack_start);
324
 
}
325
 
#endif /* UIM_SCM_GCC4_READY_GC */
326
 
 
327
 
uim_bool
328
 
uim_scm_is_alive(void)
329
 
{
330
 
  return (!sscm_is_exit_with_fatal_error);
331
 
}
332
 
 
333
 
long
334
 
uim_scm_get_verbose_level(void)
335
 
{
336
 
  return (long)scm_get_verbose_level();
337
 
}
338
 
 
339
 
void
340
 
uim_scm_set_verbose_level(long new_value)
341
 
{
342
 
  scm_set_verbose_level(new_value);
343
 
}
344
 
 
345
 
void
346
 
uim_scm_set_lib_path(const char *path)
347
 
{
348
 
  scm_set_lib_path(path);
349
 
}
350
 
 
351
 
uim_bool
352
 
uim_scm_load_file(const char *fn)
353
 
{
354
 
  uim_bool succeeded;
355
 
 
356
 
  if (!fn)
357
 
    return UIM_FALSE;
358
 
 
359
 
  UIM_EVAL_FSTRING1(NULL, "(guard (err (else #f)) (load \"%s\"))", fn);
360
 
  succeeded = uim_scm_c_bool(uim_scm_return_value());
361
 
 
362
 
  return succeeded;
363
 
}
364
 
 
365
 
uim_lisp
366
 
uim_scm_t(void)
367
 
{
368
 
  return (uim_lisp)SCM_TRUE;
369
 
}
370
 
 
371
 
uim_lisp
372
 
uim_scm_f(void)
373
 
{
374
 
  return (uim_lisp)SCM_FALSE;
375
 
}
376
 
 
377
 
uim_lisp
378
 
uim_scm_null_list(void)
379
 
{
380
 
  return (uim_lisp)SCM_NULL;
381
 
}
382
 
 
383
 
uim_bool
384
 
uim_scm_nullp(uim_lisp obj)
385
 
{
386
 
  return (SCM_NULLP((ScmObj)obj));
387
 
}
388
 
 
389
 
uim_bool
390
 
uim_scm_consp(uim_lisp obj)
391
 
{
392
 
  return (SCM_CONSP((ScmObj)obj));
393
 
}
394
 
 
395
 
uim_bool
396
 
uim_scm_integerp(uim_lisp obj)
397
 
{
398
 
  return (SCM_INTP((ScmObj)obj));
399
 
}
400
 
 
401
 
uim_bool
402
 
uim_scm_stringp(uim_lisp obj)
403
 
{
404
 
  return (SCM_STRINGP((ScmObj)obj));
405
 
}
406
 
 
407
 
uim_bool
408
 
uim_scm_eq(uim_lisp a, uim_lisp b)
409
 
{
410
 
  return (SCM_EQ((ScmObj)a, (ScmObj)b));
411
 
}
412
 
 
413
 
uim_bool
414
 
uim_scm_string_equal(uim_lisp a, uim_lisp b)
415
 
{
416
 
  return (SCM_TRUEP(scm_p_stringequalp((ScmObj)a, (ScmObj)b)));
417
 
}
418
 
 
419
 
uim_lisp
420
 
uim_scm_eval(uim_lisp obj)
421
 
#if UIM_SCM_GCC4_READY_GC
422
 
{
423
 
  return (uim_lisp)uim_scm_call_with_gc_ready_stack(uim_scm_eval_internal,
424
 
                                                    (void *)obj);
425
 
}
426
 
 
427
 
static void *
428
 
uim_scm_eval_internal(void *uim_lisp_obj)
429
 
#endif
430
 
{
431
 
  uim_lisp ret;  /* intentionally outside of next stack_start */
432
 
#if UIM_SCM_GCC4_READY_GC
433
 
  uim_lisp obj;
434
 
#else
435
 
  uim_lisp stack_start;
436
 
#endif
437
 
 
438
 
#if UIM_SCM_GCC4_READY_GC
439
 
  obj = (uim_lisp)uim_lisp_obj;
440
 
#else
441
 
  uim_scm_gc_protect_stack(&stack_start);
442
 
#endif
443
 
 
444
 
  uim_scm_last_val = ret = (uim_lisp)scm_p_eval((ScmObj)obj, SCM_NULL);
445
 
 
446
 
#if UIM_SCM_GCC4_READY_GC
447
 
  return (void *)ret;
448
 
#else
449
 
  uim_scm_gc_unprotect_stack(&stack_start);
450
 
 
451
 
  return ret;
452
 
#endif
453
 
}
454
 
 
455
 
uim_lisp
456
 
uim_scm_eval_c_string(const char *str)
457
 
{
458
 
  uim_scm_last_val = (uim_lisp)scm_eval_c_string(str);
459
 
 
460
 
  return uim_scm_last_val;
461
 
}
462
 
 
463
 
uim_lisp
464
 
uim_scm_return_value(void)
465
 
{
466
 
  /* FIXME: This function should be removed. */
467
 
  return uim_scm_last_val;
468
 
}
469
 
 
470
 
uim_lisp
471
 
uim_scm_car(uim_lisp pair)
472
 
{
473
 
  return (uim_lisp)scm_p_car((ScmObj)pair);
474
 
}
475
 
 
476
 
uim_lisp
477
 
uim_scm_cdr(uim_lisp pair)
478
 
{
479
 
  return (uim_lisp)scm_p_cdr((ScmObj)pair);
480
 
}
481
 
 
482
 
uim_lisp
483
 
uim_scm_cadr(uim_lisp lst)
484
 
{
485
 
  return (uim_lisp)scm_p_cadr((ScmObj)lst);
486
 
}
487
 
 
488
 
uim_lisp
489
 
uim_scm_caar(uim_lisp lst)
490
 
{
491
 
  return (uim_lisp)scm_p_caar((ScmObj)lst);
492
 
}
493
 
 
494
 
uim_lisp
495
 
uim_scm_cdar(uim_lisp lst)
496
 
{
497
 
  return (uim_lisp)scm_p_cdar((ScmObj)lst);
498
 
}
499
 
 
500
 
uim_lisp
501
 
uim_scm_cddr(uim_lisp lst)
502
 
{
503
 
  return (uim_lisp)scm_p_cddr((ScmObj)lst);
504
 
}
505
 
 
506
 
uim_lisp
507
 
uim_scm_cons(uim_lisp car, uim_lisp cdr)
508
 
{
509
 
  return (uim_lisp)SCM_CONS((ScmObj)car, (ScmObj)cdr);
510
 
}
511
 
 
512
 
uim_lisp
513
 
uim_scm_length(uim_lisp lst)
514
 
{
515
 
  /*
516
 
    although nlength() of siod returns length of anything, this
517
 
    function should be called only for list
518
 
  */
519
 
  return (uim_lisp)scm_p_length((ScmObj)lst);
520
 
}
521
 
 
522
 
uim_lisp
523
 
uim_scm_reverse(uim_lisp lst)
524
 
{
525
 
  return (uim_lisp)scm_p_reverse((ScmObj)lst);
526
 
}
527
 
 
528
 
uim_bool
529
 
uim_scm_require_file(const char *fn)
530
 
{
531
 
  uim_bool succeeded;
532
 
 
533
 
  if (!fn)
534
 
    return UIM_FALSE;
535
 
 
536
 
  UIM_EVAL_FSTRING1(NULL, "(guard (err (else #f)) (require \"%s\"))", fn);
537
 
  succeeded = uim_scm_c_bool(uim_scm_return_value());
538
 
 
539
 
  return succeeded;
540
 
}
541
 
 
542
 
void
543
 
uim_scm_init_subr_0(const char *name, uim_lisp (*func)(void))
544
 
{
545
 
  scm_register_func(name, (scm_procedure_fixed_0)func, SCM_PROCEDURE_FIXED_0);
546
 
}
547
 
 
548
 
void
549
 
uim_scm_init_subr_1(const char *name, uim_lisp (*func)(uim_lisp))
550
 
{
551
 
  scm_register_func(name, (scm_procedure_fixed_1)func, SCM_PROCEDURE_FIXED_1);
552
 
}
553
 
 
554
 
void
555
 
uim_scm_init_subr_2(const char *name, uim_lisp (*func)(uim_lisp, uim_lisp))
556
 
{
557
 
  scm_register_func(name, (scm_procedure_fixed_2)func, SCM_PROCEDURE_FIXED_2);
558
 
}
559
 
 
560
 
void
561
 
uim_scm_init_subr_3(const char *name, uim_lisp (*func)(uim_lisp, uim_lisp, uim_lisp))
562
 
{
563
 
  scm_register_func(name, (scm_procedure_fixed_3)func, SCM_PROCEDURE_FIXED_3);
564
 
}
565
 
 
566
 
void
567
 
uim_scm_init_subr_4(const char *name, uim_lisp (*func)(uim_lisp, uim_lisp, uim_lisp,
568
 
                                                       uim_lisp))
569
 
{
570
 
  scm_register_func(name, (scm_procedure_fixed_4)func, SCM_PROCEDURE_FIXED_4);
571
 
}
572
 
 
573
 
void
574
 
uim_scm_init_subr_5(const char *name, uim_lisp (*func)(uim_lisp, uim_lisp, uim_lisp,
575
 
                                                       uim_lisp, uim_lisp))
576
 
{
577
 
  scm_register_func(name, (scm_procedure_fixed_5)func, SCM_PROCEDURE_FIXED_5);
578
 
}
579
 
 
580
 
static void
581
 
exit_hook(void)
582
 
{
583
 
  sscm_is_exit_with_fatal_error = UIM_TRUE;
584
 
  /* FIXME: Add longjmp() to outermost uim API call, and make all API
585
 
   * calls uim_scm_is_alive()-sensitive. It should be fixed on uim
586
 
   * 1.5.  -- YamaKen 2006-06-06, 2006-12-27 */
587
 
}
588
 
 
589
 
void
590
 
uim_scm_init(const char *verbose_level)
591
 
{
592
 
  ScmStorageConf storage_conf;
593
 
  long vlevel = 2;
594
 
  ScmObj output_port;
595
 
 
596
 
  if (!uim_output)
597
 
    uim_output = stderr;
598
 
 
599
 
  if (verbose_level && isdigit((unsigned char)verbose_level[0])) {
600
 
    vlevel = atoi(verbose_level) % 10;
601
 
  }
602
 
 
603
 
#if SCM_USE_MULTIBYTE_CHAR
604
 
  /* *GC safe operation*
605
 
   * 
606
 
   * Set the raw unibyte codec which accepts all (multi)byte sequence
607
 
   * although it slashes a multibyte character on Scheme-level
608
 
   * character processing. Since current uim implementation treats a
609
 
   * multibyte character as string, it is not a problem. The name
610
 
   * "ISO-8859-1" is a dummy name for the codec.
611
 
   */
612
 
  scm_current_char_codec = scm_mb_find_codec("ISO-8859-1");
613
 
#endif
614
 
 
615
 
  /* 128KB/heap, max 0.99GB on 32-bit systems. Since maximum length of list can
616
 
   * be represented by a Scheme integer, SCM_INT_MAX limits the number of cons
617
 
   * cells. */
618
 
  storage_conf.heap_size            = 16384;
619
 
  storage_conf.heap_alloc_threshold = 16384;
620
 
  storage_conf.n_heaps_max          = SCM_INT_MAX / storage_conf.heap_size;
621
 
  storage_conf.n_heaps_init         = 1;
622
 
  storage_conf.symbol_hash_size     = 1024;
623
 
  scm_initialize(&storage_conf);
624
 
  scm_set_fatal_error_callback(exit_hook);
625
 
 
626
 
  /* GC safe */
627
 
  output_port = scm_make_shared_file_port(uim_output, "uim", SCM_PORTFLAG_OUTPUT);
628
 
  scm_out = scm_err = output_port;
629
 
 
630
 
#ifdef DEBUG_SCM
631
 
  /* required by test-im.scm */
632
 
  uim_scm_provide("debug");
633
 
#endif
634
 
 
635
 
  scm_use("srfi-23");
636
 
  scm_use("srfi-34");
637
 
  scm_use("siod");
638
 
 
639
 
  uim_scm_gc_protect(&uim_scm_last_val);
640
 
  uim_scm_set_verbose_level(vlevel);
641
 
}
642
 
 
643
 
void
644
 
uim_scm_quit(void)
645
 
{
646
 
  scm_finalize();
647
 
  sscm_is_exit_with_fatal_error = UIM_FALSE;
648
 
  uim_output = NULL;
649
 
}