2 * Copyright (c) 2008, Novell Inc.
4 * This program is licensed under the BSD license, read LICENSE.BSD
5 * for further information
16 typedef struct _Dirpool {
23 dirpool_create(Dirpool *dp)
25 memset(dp, 0, sizeof(*dp));
29 dirpool_make_dirtraverse(Dirpool *dp)
31 Id parent, i, *dirtraverse;
34 dp->dirs = sat_extend_resize(dp->dirs, dp->ndirs, sizeof(Id), DIR_BLOCK);
35 dirtraverse = sat_calloc_block(dp->ndirs, sizeof(Id), DIR_BLOCK);
36 for (parent = 0, i = 0; i < dp->ndirs; i++)
40 parent = -dp->dirs[i];
41 dirtraverse[i] = dirtraverse[parent];
42 dirtraverse[parent] = i + 1;
44 dp->dirtraverse = dirtraverse;
48 dirpool_add_dir(Dirpool *dp, Id parent, Id comp, int create)
50 Id did, d, ds, *dirtraverse;
55 dp->dirs = sat_extend_resize(dp->dirs, dp->ndirs, sizeof(Id), DIR_BLOCK);
57 dp->dirs[1] = 1; /* "" */
59 if (parent == 0 && comp == 1)
62 dirpool_make_dirtraverse(dp);
63 dirtraverse = dp->dirtraverse;
64 ds = dirtraverse[parent];
67 /* ds: first component in this block
68 * ds-1: parent link */
69 for (d = ds--; d < dp->ndirs; d++)
71 if (dp->dirs[d] == comp)
77 ds = dp->dirtraverse[ds];
81 /* a new one, find last parent */
82 for (did = dp->ndirs - 1; did > 0; did--)
83 if (dp->dirs[did] <= 0)
85 if (dp->dirs[did] != -parent)
87 /* make room for parent entry */
88 dp->dirs = sat_extend(dp->dirs, dp->ndirs, 1, sizeof(Id), DIR_BLOCK);
89 dp->dirtraverse = sat_extend(dp->dirtraverse, dp->ndirs, 1, sizeof(Id), DIR_BLOCK);
90 /* new parent block, link in */
91 dp->dirs[dp->ndirs] = -parent;
92 dp->dirtraverse[dp->ndirs] = dp->dirtraverse[parent];
93 dp->dirtraverse[parent] = ++dp->ndirs;
95 /* make room for new entry */
96 dp->dirs = sat_extend(dp->dirs, dp->ndirs, 1, sizeof(Id), DIR_BLOCK);
97 dp->dirtraverse = sat_extend(dp->dirtraverse, dp->ndirs, 1, sizeof(Id), DIR_BLOCK);
98 dp->dirs[dp->ndirs] = comp;
99 dp->dirtraverse[dp->ndirs] = 0;