/* * List operations for ToolAlias. * * mws, 4 February 1993 */ #include #include #include #include "list.h" static TOOL *head; /* empty */ void free_tool(TOOL *tool) { if (tool->oldname) FreeVec(tool->oldname); if (tool->newname) FreeVec(tool->newname); FreeVec(tool); } /* get head of list */ TOOL * get_head() { return head; } /* get tail of list */ TOOL * get_tail() { TOOL *tool = head; while (tool && tool->next) tool = tool->next; return tool; } /* add a new entry after given position in list, returning new entry/NULL if failure */ TOOL * add_tool(TOOL *curtool) { TOOL *newtool; Forbid(); if (newtool = AllocVec(sizeof(TOOL), MEMF_CLEAR|MEMF_PUBLIC)) { if (curtool) /* list non-empty */ { newtool->prev = curtool; newtool->next = curtool->next; if (curtool->next) curtool->next->prev = newtool; curtool->next = newtool; } else /* empty list - initialize */ { head = newtool; } } Permit(); return newtool; } /* remove current entry, return prev if exists, else next */ TOOL * rem_tool(TOOL *tool) { TOOL *curtool; Forbid(); if (tool->prev) tool->prev->next = tool->next; else /* first tool in list - change head */ head = tool->next; if (tool->next) tool->next->prev = tool->prev; /* determine current tool after deletion */ curtool = tool->prev ? tool->prev : tool->next; free_tool(tool); Permit(); return curtool; } /* set/update oldname in tool entry - returns success/failure */ BOOL set_oldname(TOOL *tool, char *oldname) { char *name; if (name = AllocVec(strlen(oldname)+1, MEMF_PUBLIC|MEMF_CLEAR)) { Forbid(); if (tool->oldname) FreeVec(tool->oldname); strcpy(name, oldname); tool->oldname = name; Permit(); return TRUE; } return FALSE; } /* set/update newname in tool entry - returns success/failure */ BOOL set_newname(TOOL *tool, char *newname) { char *name; if (name = AllocVec(strlen(newname)+1, MEMF_PUBLIC|MEMF_CLEAR)) { Forbid(); if (tool->newname) FreeVec(tool->newname); strcpy(name, newname); tool->newname = name; Permit(); return TRUE; } return FALSE; } /* look-up oldname in list, return newname or NULL if not found */ char * find_tool(char *name) { TOOL *tool; Forbid(); tool = head; while (tool) { if (tool->oldname && *tool->oldname) /* non-null */ if (!stricmp(name, tool->oldname)) /* case-insensitive */ { Permit(); return tool->newname; } tool = tool->next; } Permit(); return NULL; } /* remove whole list from memory */ void free_list() { TOOL *tool, *next; Forbid(); tool = head; while (tool) { next = tool->next; free_tool(tool); tool = next; } head = NULL; Permit(); }