2 * Copyright (c) 2008, Novell Inc.
4 * This program is licensed under the BSD license, read LICENSE.BSD
5 * for further information
18 dirpool_create(Dirpool *dp)
20 memset(dp, 0, sizeof(*dp));
24 dirpool_free(Dirpool *dp)
27 sat_free(dp->dirtraverse);
31 dirpool_make_dirtraverse(Dirpool *dp)
33 Id parent, i, *dirtraverse;
36 dp->dirs = sat_extend_resize(dp->dirs, dp->ndirs, sizeof(Id), DIR_BLOCK);
37 dirtraverse = sat_calloc_block(dp->ndirs, sizeof(Id), DIR_BLOCK);
38 for (parent = 0, i = 0; i < dp->ndirs; i++)
42 parent = -dp->dirs[i];
43 dirtraverse[i] = dirtraverse[parent];
44 dirtraverse[parent] = i + 1;
46 dp->dirtraverse = dirtraverse;
50 dirpool_add_dir(Dirpool *dp, Id parent, Id comp, int create)
52 Id did, d, ds, *dirtraverse;
57 dp->dirs = sat_extend_resize(dp->dirs, dp->ndirs, sizeof(Id), DIR_BLOCK);
59 dp->dirs[1] = 1; /* "" */
61 if (parent == 0 && comp == 1)
64 dirpool_make_dirtraverse(dp);
65 dirtraverse = dp->dirtraverse;
66 ds = dirtraverse[parent];
69 /* ds: first component in this block
70 * ds-1: parent link */
71 for (d = ds--; d < dp->ndirs; d++)
73 if (dp->dirs[d] == comp)
79 ds = dp->dirtraverse[ds];
83 /* a new one, find last parent */
84 for (did = dp->ndirs - 1; did > 0; did--)
85 if (dp->dirs[did] <= 0)
87 if (dp->dirs[did] != -parent)
89 /* make room for parent entry */
90 dp->dirs = sat_extend(dp->dirs, dp->ndirs, 1, sizeof(Id), DIR_BLOCK);
91 dp->dirtraverse = sat_extend(dp->dirtraverse, dp->ndirs, 1, sizeof(Id), DIR_BLOCK);
92 /* new parent block, link in */
93 dp->dirs[dp->ndirs] = -parent;
94 dp->dirtraverse[dp->ndirs] = dp->dirtraverse[parent];
95 dp->dirtraverse[parent] = ++dp->ndirs;
97 /* make room for new entry */
98 dp->dirs = sat_extend(dp->dirs, dp->ndirs, 1, sizeof(Id), DIR_BLOCK);
99 dp->dirtraverse = sat_extend(dp->dirtraverse, dp->ndirs, 1, sizeof(Id), DIR_BLOCK);
100 dp->dirs[dp->ndirs] = comp;
101 dp->dirtraverse[dp->ndirs] = 0;