#include #include #include /* for access */ #include #include #include #include "ant.h" /* for LinkList */ #include "libCfg_local.h" #include "libCfg.h" #define MAXARGS 5 LinkList CfgProjects () { return (Projects); } LinkList CfgHierarchy (int numargs, ...) { va_list ap; char *args [MAXARGS]; char *str = NULL; int count = 0; LinkList l = Projects; StrHier S; int i; assert (Projects != NULL); memset (args, 0, sizeof (args)); va_start (ap, numargs); for (i = 0; i < numargs; i++) args [i] = va_arg (ap, char *); va_end (ap); while (l != NULL) { S = (StrHier) l->data; switch (count) { case 0 : str = args [0]; break; case 1 : str = args [1]; break; case 2 : str = args [2]; break; case 3 : str = args [3]; break; case 4 : str = args [4]; break; } if (str == NULL) break; /* we found the limit of what we were looking */ else if (strcmp (SNAME (S), str) == 0) { l = SUBLIST (S); count++; } else l = l->next; } return (l); } char *CfgListName (void *data) { StrHier S = (StrHier) data; return (S->str); } StrHier CfgStrHier (int numargs, ...) { va_list ap; char *args [MAXARGS]; int i; assert (Projects != NULL); memset (args, 0, sizeof (args)); va_start (ap, numargs); for (i = 0; i < numargs; i++) args [i] = va_arg (ap, char *); va_end (ap); return (SourceByStr (Projects, args [0], args [1], args [2], args [3], args [4], NULL)); } char *CfgGetItem (const char *item, int elmt, ...) { va_list ap; char *args [MAXARGS]; int argno = 0; char *foundItem = NULL; StrHier Source = NULL; StrHier S = NULL; assert (Projects != NULL); va_start (ap, elmt); while ((argno < MAXARGS) && ((args [argno++] = va_arg (ap, char *)) != NULL)); va_end (ap); Source = SourceByStr (Projects, args [0], args [1], args [2], args [3], args [4], NULL); S = Source; while (S != NULL) { if ((foundItem = ValueFromItem (S, item, elmt))) break; S = S->parent; } if (!S) return NULL; return foundItem; } char *CfgGetPath (const char *item, ...) { va_list ap; char *args [MAXARGS]; int argno = 0; char *p; StrHier S, Source; static char path [256]; int i, j, level; assert (Projects != NULL); for (i = 0; i < MAXARGS; i++) args [i] = NULL; va_start (ap, item); while ((argno < MAXARGS) && ((args [argno++] = va_arg (ap, char *)) != NULL)); va_end (ap); /* Look for the item in the config file */ Source = SourceByStr (Projects, args [0], args [1], args [2], args [3], args [4], NULL); S = Source; while (S != NULL) { if ((p = ValueFromItem (S, item, 0))) break; S = S->parent; } if (!S) return NULL; memset (path, 0, 256); strcpy (path, p); if (path [strlen (path) - 1] != '%') { for (i = 0, S = Source; StrHierParent (S); S = StrHierParent (S), i++); i--; level = 3; while (level >= 0) { strcat (path, "/"); strcat (path, SNAME (S)); for (j = --i, S = Source; j >= 0; S = StrHierParent (S), j--); level--; } } else path [strlen (path) - 1] = '\0'; return path; }