|
|
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.