sombok 2.0.5
|
00001 /* 00002 * sombok.h - common definitions for Sombok library 00003 * 00004 * Copyright (C) 2009-2011 by Hatuka*nezumi - IKEDA Soji. 00005 * 00006 * This file is part of the Sombok Package. This program is free 00007 * software; you can redistribute it and/or modify it under the terms 00008 * of the GNU General Public License as published by the Free Software 00009 * Foundation; either version 2 of the License, or (at your option) 00010 * any later version. This program is distributed in the hope that 00011 * it will be useful, but WITHOUT ANY WARRANTY; without even the 00012 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR 00013 * PURPOSE. See the COPYING file for more details. 00014 * 00015 * $id$ 00016 */ 00017 00018 #ifndef _SOMBOK_H_ 00019 00020 #ifdef HAVE_CONFIG_H 00021 # include "config.h" 00022 #endif 00023 #include <errno.h> 00024 #include <stddef.h> 00025 #include <stdlib.h> 00026 #include <string.h> 00027 #ifdef HAVE_STRINGS_H 00028 # include <strings.h> 00029 #endif /* HAVE_STRINGS_H */ 00030 00031 #define SOMBOK_VERSION "2.0.5" 00032 00033 #define SOMBOK_UNICHAR_T_IS_WCHAR_T 00034 #define SOMBOK_UNICHAR_T_IS_UNSIGNED_INT 00035 #define SOMBOK_UNICHAR_T_IS_UNSIGNED_LONG 00036 00037 /*** 00038 *** Data structure. 00039 ***/ 00040 00041 /* Primitive types */ 00042 00044 typedef unsigned int unichar_t; 00045 00048 typedef unsigned char propval_t; 00049 00052 typedef struct { 00056 unichar_t *str; 00058 size_t len; 00059 } unistr_t; 00060 00064 typedef struct { 00066 size_t idx; 00068 size_t len; 00070 size_t col; 00072 propval_t lbc; 00074 propval_t elbc; 00076 unsigned char flag; 00077 } gcchar_t; 00078 00081 typedef struct { 00083 unichar_t beg; 00085 unichar_t end; 00087 propval_t lbc; 00089 propval_t eaw; 00091 propval_t gcb; 00093 propval_t scr; 00094 } mapent_t; 00095 00096 struct linebreak_t; 00097 00100 typedef struct { 00104 unichar_t *str; 00106 size_t len; 00109 gcchar_t *gcstr; 00111 size_t gclen; 00113 size_t pos; 00115 struct linebreak_t *lbobj; 00116 } gcstring_t; 00117 00120 typedef struct linebreak_t { 00124 unsigned long int refcount; 00126 int state; 00128 unistr_t bufstr; 00130 unistr_t bufspc; 00132 double bufcols; 00134 unistr_t unread; 00140 size_t charmax; 00142 double colmax; 00144 double colmin; 00146 mapent_t *map; 00147 size_t mapsiz; 00149 unistr_t newline; 00151 unsigned int options; 00153 void *format_data; 00154 void *sizing_data; 00155 void *urgent_data; 00157 void *user_data; 00159 void *stash; 00161 gcstring_t *(*format_func)(); 00163 double (*sizing_func)(); 00165 gcstring_t *(*urgent_func)(); 00168 gcstring_t *(*user_func)(); 00176 void (*ref_func)(void *, int, int); 00180 int errnum; 00186 gcstring_t *(**prep_func)(); 00188 void **prep_data; 00190 } linebreak_t; 00191 00192 /*** 00193 *** Constants. 00194 ***/ 00195 00197 #define PROP_UNKNOWN ((propval_t)~0) 00198 00201 #define LINEBREAK_FLAG_PROHIBIT_BEFORE (1) 00202 #define LINEBREAK_FLAG_ALLOW_BEFORE (2) 00203 #define LINEBREAK_FLAG_BREAK_BEFORE LINEBREAK_FLAG_ALLOW_BEFORE 00204 00207 #define LINEBREAK_DEFAULT_CHARMAX (998) 00208 00211 #define LINEBREAK_OPTION_EASTASIAN_CONTEXT (1) 00212 #define LINEBREAK_OPTION_HANGUL_AS_AL (2) 00213 #define LINEBREAK_OPTION_LEGACY_CM (4) 00214 #define LINEBREAK_OPTION_BREAK_INDENT (8) 00215 #define LINEBREAK_OPTION_COMPLEX_BREAKING (16) 00216 00219 typedef enum { 00220 LINEBREAK_STATE_NONE = 0, 00221 LINEBREAK_STATE_SOT, LINEBREAK_STATE_SOP, LINEBREAK_STATE_SOL, 00222 LINEBREAK_STATE_LINE, 00223 LINEBREAK_STATE_EOL, LINEBREAK_STATE_EOP, LINEBREAK_STATE_EOT, 00224 LINEBREAK_STATE_MAX 00225 } linebreak_state_t; 00228 #define LINEBREAK_STATE_SOT_FORMAT (-LINEBREAK_STATE_SOT) 00229 #define LINEBREAK_STATE_SOP_FORMAT (-LINEBREAK_STATE_SOP) 00230 #define LINEBREAK_STATE_SOL_FORMAT (-LINEBREAK_STATE_SOL) 00231 00234 #define LINEBREAK_REF_STASH (0) 00235 #define LINEBREAK_REF_FORMAT (1) 00236 #define LINEBREAK_REF_SIZING (2) 00237 #define LINEBREAK_REF_URGENT (3) 00238 #define LINEBREAK_REF_USER (4) 00239 #define LINEBREAK_REF_PREP (5) 00240 00243 #define LINEBREAK_ACTION_MANDATORY (4) 00244 #define LINEBREAK_ACTION_DIRECT (3) 00245 #define LINEBREAK_ACTION_INDIRECT (2) 00246 #define LINEBREAK_ACTION_PROHIBITED (1) 00247 00250 #define LINEBREAK_ELONG (-2) 00251 #define LINEBREAK_EEXTN (-3) 00252 00253 00254 /*** 00255 *** Public functions, global variables and macros. 00256 ***/ 00257 00258 extern void linebreak_charprop(linebreak_t *, unichar_t, 00259 propval_t *, propval_t *, propval_t *, 00260 propval_t *); 00261 00262 extern gcstring_t *gcstring_new(unistr_t *, linebreak_t *); 00263 extern gcstring_t *gcstring_newcopy(unistr_t *, linebreak_t *); 00264 extern gcstring_t *gcstring_copy(gcstring_t *); 00265 extern void gcstring_destroy(gcstring_t *); 00266 extern gcstring_t *gcstring_append(gcstring_t *, gcstring_t *); 00267 extern size_t gcstring_columns(gcstring_t *); 00268 extern int gcstring_cmp(gcstring_t *, gcstring_t *); 00269 extern gcstring_t *gcstring_concat(gcstring_t *, gcstring_t *); 00270 extern gcchar_t *gcstring_next(gcstring_t *); 00271 extern void gcstring_setpos(gcstring_t *, int); 00272 extern void gcstring_shrink(gcstring_t *, int); 00273 extern gcstring_t *gcstring_substr(gcstring_t *, int, int); 00274 extern gcstring_t *gcstring_replace(gcstring_t *, int, int, gcstring_t *); 00275 00276 #define gcstring_eos(gcstr) \ 00277 ((gcstr)->gclen <= (gcstr)->pos) 00278 #define gcstring_getpos(gcstr) \ 00279 ((gcstr)->pos) 00280 00281 extern linebreak_t *linebreak_new(); 00282 extern linebreak_t *linebreak_copy(linebreak_t *); 00283 extern linebreak_t *linebreak_incref(linebreak_t *); 00284 extern void linebreak_destroy(linebreak_t *); 00285 00286 extern void linebreak_set_newline(linebreak_t *, unistr_t *); 00287 extern void linebreak_set_stash(linebreak_t *, void *); 00288 extern void linebreak_set_format(linebreak_t *, gcstring_t *(*)(), void *); 00289 extern void linebreak_add_prep(linebreak_t *, gcstring_t *(*)(), void *); 00290 extern void linebreak_set_sizing(linebreak_t *, double (*)(), void *); 00291 extern void linebreak_set_urgent(linebreak_t *, gcstring_t *(*)(), void *); 00292 extern void linebreak_set_user(linebreak_t *, gcstring_t *(*)(), void *); 00293 extern void linebreak_reset(linebreak_t *); 00294 extern void linebreak_update_lbclass(linebreak_t *, unichar_t, propval_t); 00295 extern void linebreak_clear_lbclass(linebreak_t *); 00296 extern void linebreak_update_eawidth(linebreak_t *, unichar_t, propval_t); 00297 extern void linebreak_clear_eawidth(linebreak_t *); 00298 00299 extern propval_t linebreak_eawidth(linebreak_t *, unichar_t); 00300 extern propval_t linebreak_lbclass(linebreak_t *, unichar_t); 00301 extern propval_t linebreak_lbrule(propval_t, propval_t); 00302 00303 extern gcstring_t **linebreak_break(linebreak_t *, unistr_t *); 00304 extern gcstring_t **linebreak_break_fast(linebreak_t *, unistr_t *); 00305 extern gcstring_t **linebreak_break_partial(linebreak_t *, unistr_t *); 00306 00307 extern const char *linebreak_unicode_version; 00308 extern const char *linebreak_propvals_EA[]; 00309 extern const char *linebreak_propvals_LB[]; 00310 extern const char *linebreak_southeastasian_supported; 00311 extern void linebreak_southeastasian_flagbreak(gcstring_t *); 00312 00313 /*** 00314 *** Built-in callbacks for linebreak_t. 00315 ***/ 00316 extern gcstring_t *linebreak_format_SIMPLE(linebreak_t *, linebreak_state_t, 00317 gcstring_t *); 00318 extern gcstring_t *linebreak_format_NEWLINE(linebreak_t *, linebreak_state_t, 00319 gcstring_t *); 00320 extern gcstring_t *linebreak_format_TRIM(linebreak_t *, linebreak_state_t, 00321 gcstring_t *); 00322 extern gcstring_t *linebreak_prep_URIBREAK(linebreak_t *, void *, unistr_t *, 00323 unistr_t *); 00324 extern double linebreak_sizing_UAX11(linebreak_t *, double, gcstring_t *, 00325 gcstring_t *, gcstring_t *); 00326 extern gcstring_t *linebreak_urgent_ABORT(linebreak_t *, gcstring_t *); 00327 extern gcstring_t *linebreak_urgent_FORCE(linebreak_t *, gcstring_t *); 00328 00329 #define _SOMBOK_H_ 00330 #endif /* _SOMBOK_H_ */ 00331 00332 #ifdef MALLOC_DEBUG 00333 #include "src/mymalloc.h" 00334 #endif /* MALLOC_DEBUG */ 00335