home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-387-Vol-3of3.iso
/
f
/
fn32_101.zip
/
DTREE.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-09-13
|
3KB
|
168 lines
/* dtree.c print directory tree to stdout
**
** compile: cl -AC dtree.c fn32argv.obj
**
*/
#include "fn32argv.h"
typedef struct {
int down;
int in;
int id;
}NODE;
#define NODEMAX 2000
#define SYMMAX 10000
NODE node[NODEMAX];
char symbol[SYMMAX];
char indent [128];
char curid[34];
char arg[] = "/**/*";
int idnum;
int nodecnt;
int cur_node;
int prev_node;
main()
{
int i, argc;
char **argv;
argc = 1;
argv[0] = arg;
fn32argv(&argc, &argv, NULL, FN32_DIRECTORY);
symbol[1] = 1;
nodecnt = 1;
for(i = 0; i < argc; ++i)
build_tree(argv[i]);
argv_free(&argc, &argv, NULL);
print_tree();
}
build_tree(char *cp)
{
cur_node = 1;
prev_node = 0;
while(idnum = nxtid(&cp))
cur_node = make_node();
}
int make_node()
{
if(nodecnt > cur_node)
{
if(node[cur_node].id == idnum)
{
prev_node = cur_node;
try_in: if(node[cur_node].in > 0)
return node[cur_node].in;
else return nodecnt;
}
prev_node = cur_node;
while(node[prev_node].down > 0)
{
prev_node = node[prev_node].down;
if(node[prev_node].id == idnum)
{
cur_node = prev_node;
goto try_in;
}
}
node[prev_node].down = cur_node = nodecnt;
}
/* add a node */
if(nodecnt >= NODEMAX-1)
{
printf("Too many nodes.\n");
exit(1);
}
node[nodecnt].id = idnum;
node[nodecnt].down = 0;
node[nodecnt].in = -1;
if( prev_node != nodecnt
&& node[prev_node].down == 0
&& node[prev_node].in == -1)
{
node[prev_node].in = nodecnt;
}
prev_node = cur_node;
return ++nodecnt;
}
int nxtid(char **str)
{
int i, j;
char *cp = *str;
char *idp = curid;
if(!*cp) return 0; /* eos */
/* strip current symbol to 'curid' */
while(*cp)
{
if((*idp = *cp++) == '/')
break;
else ++idp;
}
*idp = 0;
*str = cp;
/* insert symbol -- this is about as slow as it gets */
/* but partial symbols are reused thus saving space */
for(i = 1; symbol[i] != 1; i++)
{/* o.o.one character at a time */
if(!strcmp(curid, &symbol[i]))
return i;
}
j = strlen(curid) + 1;
if(i+j >= SYMMAX)
{
printf("Too many symbols.\n");
exit(2);
}
strcpy(&symbol[i], curid);
symbol[i+j] = 1;
return i;
}
print_tree()
{
indent[0] = '\0';
if(nodecnt > 1)
{
prt_node(1);
trace(2);
}
else printf("No tree.\n");
}
trace(int n)
{
while(node[n].down > 0)
{
strcat(indent, "├─");
prt_node(n);
indent[strlen(indent)-2] = 0;
if (node[n].in > 0)
{
strcat(indent, "│ ");
trace(node[n].in);
indent[strlen(indent)-2] = 0;
}
n = node[n].down;
}
/* Last node on this level. */
strcat(indent, "└─");
prt_node(n);
indent[strlen(indent)-2] = 0;
if(node[n].in > 0)
{
strcat(indent, "· ");
trace(node[n].in);
indent[strlen(indent)-2] = 0;
}
}
prt_node(int n)
{
printf("%s%s\n", indent, &symbol[node[n].id]);
}