00001
00006 #ifndef GALE_MISC_H
00007 #define GALE_MISC_H
00008
00009 #include <stdio.h>
00010 #include <string.h>
00011 #include <stddef.h>
00012
00013 #include "gale/types.h"
00014 #include "gale/core.h"
00015 #include "oop.h"
00016
00019
00021 enum gale_print_flags {
00023 gale_print_bold = 1,
00025 gale_print_clobber_left = 2,
00027 gale_print_clobber_right = 4
00028 };
00029
00034 void gale_print(FILE *fp,int attr,struct gale_text str);
00035
00038 void gale_print_line(FILE *fp,int attr,struct gale_text);
00039
00041 int gale_column(int start,wch);
00042
00046 int gale_text_width(struct gale_text str);
00047
00050 void gale_beep(FILE *fp);
00051
00055 int gale_columns(FILE *fp);
00056
00057 struct gale_text gale_read_line(FILE *fp);
00062
00063 void gale_exec(oop_source *,struct gale_text prog,
00064 int count,const struct gale_text *,
00065 int *in,int *out,
00066 int (*)(int count,const struct gale_text *,void *user),
00067 void *(*)(int status,void *user),
00068 void *user);
00069
00073 void gale_restart(void);
00074
00081 void gale_kill(struct gale_text class,int do_kill);
00082
00087 void gale_cleanup(void (*cleanup)(void *),void *);
00088
00092 void gale_do_cleanup();
00093
00099 void gale_watch_tty(oop_source *oop,int fd);
00100
00101 void gale_daemon(oop_source *);
00102 void gale_detach(oop_source *);
00107
00109 extern const struct gale_data null_data;
00110
00113 void *gale_malloc(size_t size);
00115 void *gale_malloc_atomic(size_t size);
00117 void *gale_malloc_safe(size_t size);
00123 void *gale_realloc(void *mem,size_t len);
00127 void gale_free(void *);
00128
00133 void gale_finalizer(void *ptr,void (*fun)(void *ptr,void *user),void *user);
00134
00137 void gale_check_mem(void);
00138
00142 #define gale_create(x) ((x) = gale_malloc(sizeof(*(x))))
00143
00147 #define gale_create_array(x,count) ((x) = gale_malloc(sizeof(*(x)) * (count)))
00148
00152 #define gale_resize_array(x,count) ((x) = gale_realloc(x,sizeof(*(x)) * (count)))
00153
00157 struct gale_data gale_data_copy(struct gale_data data);
00158
00162 int gale_data_compare(struct gale_data a,struct gale_data b);
00163
00164 struct gale_ptr;
00165
00173 struct gale_ptr *gale_make_weak(void *ptr);
00174
00181 struct gale_ptr *gale_make_ptr(void *);
00182
00188 void *gale_get_ptr(struct gale_ptr *wp);
00196
00198 extern const struct gale_text null_text;
00199 struct gale_encoding;
00200
00203 #define G_(x) (_gale_text_literal(L##x,sizeof(L##x) / sizeof(wch) - 1))
00204
00206 struct gale_text _gale_text_literal(const wchar_t *,size_t len);
00207
00208 struct gale_text gale_text_concat(int count,...);
00209 struct gale_text gale_text_concat_array(int count,struct gale_text *array);
00210
00213 struct gale_text_accumulator {
00214 int count;
00215 struct gale_text array[100];
00216 };
00217
00219 extern const struct gale_text_accumulator null_accumulator;
00220 void gale_text_accumulate(struct gale_text_accumulator *,struct gale_text);
00221 int gale_text_accumulator_empty(const struct gale_text_accumulator *);
00222 struct gale_text gale_text_collect(const struct gale_text_accumulator *);
00223
00224 struct gale_text gale_text_left(struct gale_text,int len);
00225 struct gale_text gale_text_right(struct gale_text,int len);
00226
00227 int gale_text_token(struct gale_text string,wch sep,struct gale_text *token);
00228 struct gale_text gale_text_replace(
00229 struct gale_text original,
00230 struct gale_text find,
00231 struct gale_text replace);
00232
00233 int gale_text_compare(struct gale_text a,struct gale_text b);
00234
00235 int gale_text_to_number(struct gale_text str);
00236 struct gale_text gale_text_from_number(int n,int base,int pad);
00237
00238 struct gale_data gale_text_as_data(struct gale_text);
00239 struct gale_text gale_text_from_data(struct gale_data);
00240
00247 struct gale_encoding *gale_make_encoding(struct gale_text enc);
00248
00255 struct gale_text gale_text_from(struct gale_encoding *enc,const char *str,int len);
00256
00262 char *gale_text_to(struct gale_encoding *enc,struct gale_text str);
00267
00268 struct gale_map;
00269
00276 struct gale_map *gale_make_map(int weak);
00277
00284 void gale_map_add(struct gale_map *map,struct gale_data key,void *data);
00285
00290 void *gale_map_find(const struct gale_map *map,struct gale_data key);
00291
00307 int gale_map_walk(const struct gale_map *map,const struct gale_data *after,
00308 struct gale_data *key,void **data);
00313 struct timeval;
00314
00316 struct gale_time gale_time_zero(void);
00318 struct gale_time gale_time_now(void);
00320 struct gale_time gale_time_forever(void);
00322 struct gale_time gale_time_seconds(int sec);
00323
00327 int gale_time_compare(struct gale_time a,struct gale_time b);
00328
00331 struct gale_time gale_time_diff(struct gale_time a,struct gale_time b);
00332
00335 struct gale_time gale_time_add(struct gale_time a,struct gale_time b);
00336
00340 void gale_time_to(struct timeval *tv,struct gale_time time);
00341
00345 void gale_time_from(struct gale_time *time,const struct timeval *tv);
00346
00350 struct gale_text gale_time_format(struct gale_time time);
00359
00361 struct gale_group gale_group_empty(void);
00362
00367 void gale_group_add(struct gale_group *group,struct gale_fragment frag);
00368
00372 void gale_group_append(struct gale_group *a,struct gale_group b);
00373
00375 struct gale_group gale_group_find(struct gale_group,
00376 struct gale_text name,
00377 enum gale_fragment_type);
00378
00384 int gale_group_remove(struct gale_group *group,
00385 struct gale_text name,
00386 enum gale_fragment_type type);
00387
00393 void gale_group_replace(struct gale_group *group,struct gale_fragment frag);
00394
00396 int gale_group_null(struct gale_group);
00397
00399 struct gale_fragment gale_group_first(struct gale_group);
00400
00403 struct gale_group gale_group_rest(struct gale_group);
00404
00406 void gale_group_prefix(struct gale_group *,struct gale_group tail);
00407
00414 int gale_group_lookup(
00415 struct gale_group group,struct gale_text name,
00416 enum gale_fragment_type type,
00417 struct gale_fragment *frag);
00418
00420 struct gale_text gale_print_fragment(struct gale_fragment,int indent);
00421
00423 struct gale_text gale_print_group(struct gale_group,int indent);
00424
00428 int gale_fragment_compare(struct gale_fragment a,struct gale_fragment b);
00429
00433 int gale_group_compare(struct gale_group a,struct gale_group b);
00455 int gale_unpack_copy(struct gale_data *,void *,size_t);
00456 int gale_unpack_compare(struct gale_data *,const void *,size_t);
00457 void gale_pack_copy(struct gale_data *,const void *,size_t);
00458 #define gale_copy_size(s) (s)
00459
00460 int gale_unpack_skip(struct gale_data *);
00461 void gale_pack_skip(struct gale_data *,size_t);
00462 #define gale_skip_size(sz) ((sz) + gale_u32_size())
00463
00464 int gale_unpack_rle(struct gale_data *,void *,size_t);
00465 void gale_pack_rle(struct gale_data *,const void *,size_t);
00466 #define gale_rle_size(s) (((s)+127)/128+(s))
00467
00468 int gale_unpack_u32(struct gale_data *,u32 *);
00469 void gale_pack_u32(struct gale_data *,u32);
00470 #define gale_u32_size() (sizeof(u32))
00471
00472 int gale_unpack_wch(struct gale_data *,wch *);
00473 void gale_pack_wch(struct gale_data *,wch);
00474 #define gale_wch_size() (sizeof(u16))
00475
00476
00477 int gale_unpack_str(struct gale_data *,const char **);
00478 void gale_pack_str(struct gale_data *,const char *);
00479 #define gale_str_size(t) (strlen(t) + 1)
00480
00481 int gale_unpack_text(struct gale_data *,struct gale_text *);
00482 void gale_pack_text(struct gale_data *,struct gale_text);
00483 #define gale_text_size(t) (gale_text_len_size(t) + gale_u32_size())
00484
00485 int gale_unpack_text_len(struct gale_data *,size_t len,
00486 struct gale_text *);
00487 void gale_pack_text_len(struct gale_data *,struct gale_text);
00488 #define gale_text_len_size(t) ((t).l * gale_wch_size())
00489
00490 int gale_unpack_time(struct gale_data *,struct gale_time *);
00491 void gale_pack_time(struct gale_data *,struct gale_time);
00492 #define gale_time_size() (sizeof(u32) * 4)
00493
00494 int gale_unpack_fragment(struct gale_data *,struct gale_fragment *);
00495 void gale_pack_fragment(struct gale_data *,struct gale_fragment);
00496 size_t gale_fragment_size(struct gale_fragment);
00497
00498 int gale_unpack_group(struct gale_data *,struct gale_group *);
00499 void gale_pack_group(struct gale_data *,struct gale_group);
00500 size_t gale_group_size(struct gale_group);
00505 00506 00507 00508
00509
00510 void make_dir(struct gale_text path,int mode);
00511 struct gale_text sub_dir(struct gale_text path,struct gale_text sub);
00512 struct gale_text submk_dir(struct gale_text path,struct gale_text sub,int mode);
00513 struct gale_text up_dir(struct gale_text path);
00514 struct gale_text dir_file(struct gale_text path,struct gale_text file);
00515 struct gale_text dir_search(struct gale_text name,int cwd,struct gale_text,...);
00516
00517 struct gale_data gale_read_from(int fd,int size_limit);
00518 int gale_write_to(int fd,struct gale_data data);
00519
00520 struct gale_file_state;
00521 struct gale_data gale_read_file(
00522 struct gale_text name,
00523 int size_limit,int do_paranoia,
00524 struct gale_file_state **state);
00525 int gale_write_file(
00526 struct gale_text name,
00527 struct gale_data data,
00528 int is_private,
00529 struct gale_file_state **state);
00530
00531 int gale_erase_file(const struct gale_file_state *state);
00532 int gale_file_changed(const struct gale_file_state *since);
00533 struct gale_time gale_get_file_time(const struct gale_file_state *state);
00534 void gale_set_file_time(struct gale_file_state *state,struct gale_time);
00535
00541 enum gale_error { GALE_NOTICE, GALE_WARNING, GALE_ERROR };
00542
00549 typedef void *gale_call_error(int severity,struct gale_text msg,void *user);
00550
00551 void gale_alert(int severity,struct gale_text str,int err);
00552 void gale_on_error(oop_source *oop,gale_call_error *func,void *user);
00557 struct gale_report;
00558
00564 typedef struct gale_text gale_report_call(void *user);
00565
00572 struct gale_report *gale_make_report(struct gale_report *outer);
00573
00579 void gale_report_add(struct gale_report *outer,gale_report_call *func,void *user);
00580
00586 void gale_report_remove(struct gale_report *,gale_report_call *,void *);
00587
00593 struct gale_text gale_report_run(struct gale_report *);
00594
00597 void gale_dprintf(int level,const char *fmt,...);
00598
00601 void gale_diprintf(int level,int indent,const char *fmt,...);
00607
00615 typedef void *gale_connect_call(int fd,
00616 struct gale_text hostname,struct sockaddr_in addr,
00617 int found_local,void *user);
00618
00619 struct gale_text gale_connect_text(struct gale_text host,struct sockaddr_in);
00620
00621 struct gale_connect;
00622 struct gale_connect *gale_make_connect(
00623 oop_source *source,struct gale_text host,int avoid_local_port,
00624 gale_connect_call *,void *);
00625
00626 void gale_abort_connect(struct gale_connect *);
00629 #endif