|
|
1.1 ! root 1: /* $Header$ */ ! 2: ! 3: /* ! 4: * Author: Peter J. Nicklin ! 5: */ ! 6: #include <stdio.h> ! 7: #include "macro.h" ! 8: #include "null.h" ! 9: #include "path.h" ! 10: #include "pdb.h" ! 11: #include "pdlist.h" ! 12: #include "pld.h" ! 13: #include "slslist.h" ! 14: #include "spms.h" ! 15: #include "yesno.h" ! 16: ! 17: /* ! 18: * execlist() executes a project directory list. Returns non-zero error ! 19: * status if error. ! 20: */ ! 21: execlist(pdlist) ! 22: PDLIST *pdlist; /* project directory list */ ! 23: { ! 24: extern int ERRSTATUS; /* pexec error status */ ! 25: extern int EXECUTE; /* execute command? */ ! 26: extern int PRINT_HEADING; /* print headings for project dirs */ ! 27: int ch_dir(); /* change current working directory */ ! 28: int execcmd(); /* execute command in directory */ ! 29: int status = 0; /* return status */ ! 30: PDBLK *pdblk; /* project directory list block */ ! 31: void print_title(); /* print project directory title */ ! 32: ! 33: for (pdblk = pdlist->head; pdblk != NULL; pdblk = pdblk->next) ! 34: { ! 35: if (PRINT_HEADING == YES) ! 36: print_title(pdblk->ppath); ! 37: if (ch_dir(pdblk->rpath) == NO) ! 38: status = ERRSTATUS; ! 39: else if (EXECUTE == YES) ! 40: status |= execcmd(pdblk->project); ! 41: } ! 42: return(status); ! 43: } ! 44: ! 45: ! 46: ! 47: /* ! 48: * execproject() builds a project directory list and executes commands ! 49: * within directories on that list. ! 50: */ ! 51: execproject(ppathname, pathname) ! 52: char *ppathname; /* project root dir project pathname */ ! 53: char *pathname; /* regular project root dir pathname */ ! 54: { ! 55: extern int ERRSTATUS; /* pexec error status */ ! 56: char ppathbuf[PPATHSIZE]; /* project pathname buffer */ ! 57: char *pdprepend(); /* prepend project directory */ ! 58: char *ppathcat(); /* project pathname concatenation */ ! 59: char *slsprepend(); /* prepend key+string */ ! 60: int closepdb(); /* close database */ ! 61: int errpdb(); /* print database error message */ ! 62: int execlist(); /* execute project directory list */ ! 63: int slssort(); /* sort list */ ! 64: int status = 0; /* return status */ ! 65: int strcmp(); /* string comparison */ ! 66: PATH *pd; /* pathname struct pointer */ ! 67: PATH *readpld(); /* read project link directory entry */ ! 68: PDB *openpdb(); /* open database */ ! 69: PDB *pldp; /* project link directory stream */ ! 70: PDLIST *pdinit(); /* initialize project directory list */ ! 71: PDLIST *pdlist; /* project directory list */ ! 72: SLSBLK *pblk; /* project list block */ ! 73: SLSLIST *plist; /* project list */ ! 74: SLSLIST *slsinit(); /* initialize list */ ! 75: void pdrm(); /* remove project directory list */ ! 76: void pdsort(); /* sort project directory list */ ! 77: void slsrm(); /* remove list item */ ! 78: ! 79: pdlist = pdinit(); ! 80: plist = slsinit(); ! 81: ! 82: /* read PLDNAME project link directory */ ! 83: if ((pldp = openpdb(PLDNAME, pathname, "r")) == NULL) ! 84: return(errpdb((PDB *) NULL)); ! 85: while ((pd = readpld(pldp)) != NULL) ! 86: { ! 87: if (EQUAL(pd->p_alias, PARENTPROJECT)) ! 88: continue; ! 89: ! 90: if (EQUAL(pd->p_alias, CURPROJECT)) ! 91: { ! 92: pdprepend(ppathname, pd->p_path, pathname, pdlist); ! 93: } ! 94: else if (pd->p_mode == P_IFPROOT) ! 95: { ! 96: if (slsprepend(pd->p_alias, pd->p_path, plist) == NULL) ! 97: pxexit(); ! 98: } ! 99: else { ! 100: ppathcat(ppathbuf, ppathname, pd->p_alias); ! 101: pdprepend(ppathbuf, pd->p_path, pathname, pdlist); ! 102: } ! 103: } ! 104: if (closepdb(pldp) != 0) ! 105: status = ERRSTATUS; ! 106: ! 107: /* sort and execute project directories */ ! 108: pdsort(strcmp, pdlist); ! 109: status |= execlist(pdlist); ! 110: pdrm(pdlist); ! 111: ! 112: /* execute subprojects */ ! 113: if (slssort(strcmp, plist) == NO) ! 114: pxexit(); ! 115: for (pblk = plist->head; pblk != NULL; pblk = pblk->next) ! 116: { ! 117: ppathcat(ppathbuf, ppathname, pblk->key); ! 118: status |= execproject(ppathbuf, pblk->string); ! 119: } ! 120: slsrm(CNULL, plist); ! 121: ! 122: return(status); ! 123: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.