/* ==================================================================== * Copyright 1999 Web Juice, LLC. All rights reserved. * * nclist.c * * Functions for manipulating the named context list structure in the * template library. * * ==================================================================== */ #include #include #include /* ==================================================================== * NAME: nclist_init * * DESCRIPTION: Initializes and returns a pointer to a new named * context structure. * * RETURN VALUES: Returns NULL if the memory allocation fails; otherwise * returns a pointer to a named context structure. * * BUGS: Hopefully none. * ==================================================================== */ nclist_p nclist_init(void) { nclist_p named_context_list; named_context_list = (nclist_p)malloc(sizeof(nclist)); if (named_context_list == NULL) { template_errno = TMPL_EMALLOC; return NULL; } named_context_list->name = NULL; named_context_list->context = NULL; named_context_list->next = NULL; return(named_context_list); } /* ==================================================================== * NAME: nclist_destroy * * DESCRIPTION: Frees up all memory associated with a named context list. * * RETURN VALUES: None. * * BUGS: Because a free()d pointer still *looks* valid, it is * difficult to protect against the problems that arise * if the user calls this function too early. * ==================================================================== */ void nclist_destroy(nclist_p named_context_list) { nclist_p next; if (named_context_list == NULL) { return; } next = named_context_list->next; if (named_context_list->context != NULL) { context_destroy(named_context_list->context); named_context_list->context = NULL; } if (named_context_list->name != NULL) { free(named_context_list->name); named_context_list->name = NULL; } named_context_list->next = NULL; free(named_context_list); nclist_destroy(next); } /* ==================================================================== * NAME: nclist_get_context * * DESCRIPTION: Returns a pointer to a context stored under the * given name. * * RETURN VALUES: Returns NULL if there's any trouble; otherwise returns * a context pointer. * * BUGS: Hopefully none. * ==================================================================== */ context_p nclist_get_context(nclist_p named_context_list, char *name) { nclist_p current = named_context_list; while (current != NULL) { if ((current->name != NULL) && (current->context != NULL) && (strcmp(current->name, name) == 0)) { return(current->context); } current = current->next; } template_errno = TMPL_ENOCTX; return NULL; } /* ==================================================================== * NAME: nclist_new_context * * DESCRIPTION: Store a new context under the given name. This will * grow the list as needed. * * RETURN VALUES: Returns 0 if there's any trouble. Returns 1 if the * context was successfully added. * * BUGS: Hopefully none. * ==================================================================== */ int nclist_new_context(nclist_p *named_context_list, char *name) { nclist_p new = NULL; int length; if (name == NULL) { template_errno = TMPL_ENULLARG; return 0; } new = nclist_init(); if (new == NULL) { return 0; } new->context = context_init(); if (new->context == NULL) { free(new); return 0; } length = strlen(name); new->name = (char *)malloc(length + 1); strncpy(new->name, name, length); new->name[length] = '\0'; new->next = *named_context_list; *named_context_list = new; return 1; }