X-Git-Url: http://ncurses.scripts.mit.edu/?p=ncurses.git;a=blobdiff_plain;f=ncurses%2Ftinfo%2Falloc_entry.c;fp=ncurses%2Falloc_entry.c;h=570b48a9af8066b1296a2df0bce35450ad05ec22;hp=169e71cdb2c79df57de7ca6dd5d69cc5b084c30f;hb=refs%2Ftags%2Fv5.0;hpb=661078ddbde3ce0f3b06e95642fbb9b5fef7dca1 diff --git a/ncurses/alloc_entry.c b/ncurses/tinfo/alloc_entry.c similarity index 63% rename from ncurses/alloc_entry.c rename to ncurses/tinfo/alloc_entry.c index 169e71cd..570b48a9 100644 --- a/ncurses/alloc_entry.c +++ b/ncurses/tinfo/alloc_entry.c @@ -35,20 +35,23 @@ /* * alloc_entry.c -- allocation functions for terminfo entries * + * _nc_copy_entry() * _nc_init_entry() + * _nc_merge_entry() * _nc_save_str() - * _nc_merge_entry(); - * _nc_wrap_entry(); + * _nc_wrap_entry() * */ #include #include -#include #include -MODULE_ID("$Id: alloc_entry.c,v 1.13 1998/02/11 12:13:53 tom Exp $") +MODULE_ID("$Id: alloc_entry.c,v 1.30 1999/03/01 02:03:45 tom Exp $") + +#define ABSENT_OFFSET -1 +#define CANCELLED_OFFSET -2 #define MAX_STRTAB 4096 /* documented maximum entry size */ @@ -60,16 +63,42 @@ void _nc_init_entry(TERMTYPE *const tp) { int i; - for (i=0; i < BOOLCOUNT; i++) - tp->Booleans[i] = FALSE; +#if NCURSES_XNAMES + tp->num_Booleans = BOOLCOUNT; + tp->num_Numbers = NUMCOUNT; + tp->num_Strings = STRCOUNT; + tp->ext_Booleans = 0; + tp->ext_Numbers = 0; + tp->ext_Strings = 0; +#endif + if (tp->Booleans == 0) + tp->Booleans = typeMalloc(char,BOOLCOUNT); + if (tp->Numbers == 0) + tp->Numbers = typeMalloc(short,NUMCOUNT); + if (tp->Strings == 0) + tp->Strings = typeMalloc(char *,STRCOUNT); + + for_each_boolean(i,tp) + tp->Booleans[i] = FALSE; + + for_each_number(i,tp) + tp->Numbers[i] = ABSENT_NUMERIC; + + for_each_string(i,tp) + tp->Strings[i] = ABSENT_STRING; - for (i=0; i < NUMCOUNT; i++) - tp->Numbers[i] = -1; + next_free = 0; +} - for (i=0; i < STRCOUNT; i++) - tp->Strings[i] = (char *)NULL; +ENTRY *_nc_copy_entry(ENTRY *oldp) +{ + ENTRY *newp = typeCalloc(ENTRY,1); - next_free = 0; + if (newp != 0) { + *newp = *oldp; + _nc_copy_termtype(&(newp->tterm), &(oldp->tterm)); + } + return newp; } char *_nc_save_str(const char *const string) @@ -91,42 +120,64 @@ size_t len = strlen(string) + 1; void _nc_wrap_entry(ENTRY *const ep) /* copy the string parts to allocated storage, preserving pointers to it */ { -int offsets[STRCOUNT], useoffsets[MAX_USES]; +int offsets[MAX_ENTRY_SIZE/2], useoffsets[MAX_USES]; int i, n; - - n = ep->tterm.term_names - stringbuf; - for (i=0; i < STRCOUNT; i++) - if (ep->tterm.Strings[i] == (char *)NULL) - offsets[i] = -1; - else if (ep->tterm.Strings[i] == CANCELLED_STRING) - offsets[i] = -2; +TERMTYPE *tp = &(ep->tterm); + + n = tp->term_names - stringbuf; + for_each_string(i, &(ep->tterm)) { + if (tp->Strings[i] == ABSENT_STRING) + offsets[i] = ABSENT_OFFSET; + else if (tp->Strings[i] == CANCELLED_STRING) + offsets[i] = CANCELLED_OFFSET; else - offsets[i] = ep->tterm.Strings[i] - stringbuf; + offsets[i] = tp->Strings[i] - stringbuf; + } - for (i=0; i < ep->nuses; i++) - if (ep->uses[i].parent == (void *)NULL) - useoffsets[i] = -1; + for (i=0; i < ep->nuses; i++) { + if (ep->uses[i].parent == (void *)0) + useoffsets[i] = ABSENT_OFFSET; else useoffsets[i] = (char *)(ep->uses[i].parent) - stringbuf; + } - if ((ep->tterm.str_table = (char *)malloc(next_free)) == (char *)NULL) + if ((tp->str_table = typeMalloc(char, next_free)) == (char *)0) _nc_err_abort("Out of memory"); - (void) memcpy(ep->tterm.str_table, stringbuf, next_free); - - ep->tterm.term_names = ep->tterm.str_table + n; - for (i=0; i < STRCOUNT; i++) - if (offsets[i] == -1) - ep->tterm.Strings[i] = (char *)NULL; - else if (offsets[i] == -2) - ep->tterm.Strings[i] = CANCELLED_STRING; + (void) memcpy(tp->str_table, stringbuf, next_free); + + tp->term_names = tp->str_table + n; + for_each_string(i, &(ep->tterm)) { + if (offsets[i] == ABSENT_OFFSET) + tp->Strings[i] = ABSENT_STRING; + else if (offsets[i] == CANCELLED_OFFSET) + tp->Strings[i] = CANCELLED_STRING; else - ep->tterm.Strings[i] = ep->tterm.str_table + offsets[i]; + tp->Strings[i] = tp->str_table + offsets[i]; + } - for (i=0; i < ep->nuses; i++) - if (useoffsets[i] == -1) - ep->uses[i].parent = (void *)NULL; +#if NCURSES_XNAMES + if ((n = NUM_EXT_NAMES(tp)) != 0) { + unsigned length = 0; + for (i = 0; i < n; i++) { + length += strlen(tp->ext_Names[i]) + 1; + offsets[i] = tp->ext_Names[i] - stringbuf; + } + if ((tp->ext_str_table = typeMalloc(char, length)) == 0) + _nc_err_abort("Out of memory"); + for (i = 0, length = 0; i < n; i++) { + tp->ext_Names[i] = tp->ext_str_table + length; + strcpy(tp->ext_Names[i], stringbuf + offsets[i]); + length += strlen(tp->ext_Names[i]) + 1; + } + } +#endif + + for (i=0; i < ep->nuses; i++) { + if (useoffsets[i] == ABSENT_OFFSET) + ep->uses[i].parent = (void *)0; else - ep->uses[i].parent = (char *)(ep->tterm.str_table + useoffsets[i]); + ep->uses[i].parent = (char *)(tp->str_table + useoffsets[i]); + } } void _nc_merge_entry(TERMTYPE *const to, TERMTYPE *const from) @@ -134,7 +185,10 @@ void _nc_merge_entry(TERMTYPE *const to, TERMTYPE *const from) { int i; - for (i=0; i < BOOLCOUNT; i++) +#if NCURSES_XNAMES + _nc_align_termtype(to, from); +#endif + for_each_boolean(i, from) { int mergebool = from->Booleans[i]; @@ -144,7 +198,7 @@ void _nc_merge_entry(TERMTYPE *const to, TERMTYPE *const from) to->Booleans[i] = mergebool; } - for (i=0; i < NUMCOUNT; i++) + for_each_number(i, from) { int mergenum = from->Numbers[i]; @@ -159,7 +213,7 @@ void _nc_merge_entry(TERMTYPE *const to, TERMTYPE *const from) * storage. This is OK right now, but will be a problem if we * we ever want to deallocate entries. */ - for (i=0; i < STRCOUNT; i++) + for_each_string(i, from) { char *mergestring = from->Strings[i]; @@ -169,4 +223,3 @@ void _nc_merge_entry(TERMTYPE *const to, TERMTYPE *const from) to->Strings[i] = mergestring; } } -