pathnext.c revision 3f54fd611f536639ec30dd53c48e5ec1897cc7d9
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian Maeder/***********************************************************************
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian Maeder* *
e47d29b522739fbf08aac80c6faa447dde113fbcChristian Maeder* This software is part of the ast package *
11d6ec73ee5550e00cb56b221bdbeb709142e779Christian Maeder* Copyright (c) 1989-2012 AT&T Intellectual Property *
97018cf5fa25b494adffd7e9b4e87320dae6bf47Christian Maeder* and is licensed under the *
f3cd81f98592d1dbf301f48af31677a6a0cc666aChristian Maeder* Eclipse Public License, Version 1.0 *
3f69b6948966979163bdfe8331c38833d5d90ecdChristian Maeder* by AT&T Intellectual Property *
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian Maeder* *
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder* A copy of the License is available at *
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian Maeder* http://www.eclipse.org/org/documents/epl-v10.html *
f3a94a197960e548ecd6520bb768cb0d547457bbChristian Maeder* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
f3cd81f98592d1dbf301f48af31677a6a0cc666aChristian Maeder* *
f3cd81f98592d1dbf301f48af31677a6a0cc666aChristian Maeder* Information and Software Systems Research *
ac142c1b088711f911018d8108a64be80b2f2a58Christian Maeder* AT&T Research *
ac142c1b088711f911018d8108a64be80b2f2a58Christian Maeder* Florham Park NJ *
ac142c1b088711f911018d8108a64be80b2f2a58Christian Maeder* *
ac142c1b088711f911018d8108a64be80b2f2a58Christian Maeder* Glenn Fowler <gsf@research.att.com> *
f3cd81f98592d1dbf301f48af31677a6a0cc666aChristian Maeder* David Korn <dgk@research.att.com> *
0216a1580abf46ed8981f25e89d6fd99b2944ac2Christian Maeder* Eduardo Krell <ekrell@adexus.cl> *
f454c20b6c126bea7d31d400cc8824b9ee8cc6eaChristian Maeder* *
1c67beb3720d0b84d8d71ee2012166a09be81fbdChristian Maeder***********************************************************************/
1c67beb3720d0b84d8d71ee2012166a09be81fbdChristian Maeder#pragma prototyped
1c67beb3720d0b84d8d71ee2012166a09be81fbdChristian Maeder
23f8d286586ff38a9e73052b2c7c04c62c5c638fChristian Maeder#include "3d.h"
e8ffec0fa3d3061061bdc16e44247b9cf96b050fChristian Maeder
4b0a4c7dea0f67a233dcc42ce9bb18d36de109aeChristian Maeder/*
1c67beb3720d0b84d8d71ee2012166a09be81fbdChristian Maeder * get next view for path sp
1c67beb3720d0b84d8d71ee2012166a09be81fbdChristian Maeder */
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder
1c67beb3720d0b84d8d71ee2012166a09be81fbdChristian Maederchar*
1c67beb3720d0b84d8d71ee2012166a09be81fbdChristian Maederpathnext(char* sp, char* extra, long* visits)
62925f4a144f45b5ed1e7c841f891d13f51e553dChristian Maeder{
715ffaf874309df081d1e1cd8e05073fc1227729Christian Maeder register char* ep = sp + strlen(sp);
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian Maeder register char* cp;
53301de22afd7190981b363b57c48df86fcb50f7Christian Maeder register char* tmp;
cdaff0507c1b7240e2660dbb311f9c4646a6d14aChristian Maeder register int shift;
f3cd81f98592d1dbf301f48af31677a6a0cc666aChristian Maeder Map_t* vpath;
ff9a53595208f532c25ac5168f772f48fd80fdb5Christian Maeder int vpathlen;
1eb10c0c30323eed3cc21082fd242cd09a612dc5Christian Maeder
1eb10c0c30323eed3cc21082fd242cd09a612dc5Christian Maeder message((-4, "pathnext: ++ %s%s%s [0x%08x]", sp, extra ? " + " : state.null, extra ? extra : state.null, visits ? *visits : 0L));
1eb10c0c30323eed3cc21082fd242cd09a612dc5Christian Maeder
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder /*
e47d29b522739fbf08aac80c6faa447dde113fbcChristian Maeder * check for next layer and previous visit
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder */
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder if (state.path.level + 1 >= state.limit)
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder {
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder message((-4, "pathnext: -- %s [limit=%d]", NiL, state.limit));
975642b989852fc24119c59cf40bc1af653608ffChristian Maeder return 0;
836e72a3c413366ba9801726f3b249c7791cb9caChristian Maeder }
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder ep = sp + (shift = strlen(sp));
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder if (!(vpath = search(state.path.table ? state.path.table : &state.vpath, sp, shift, (const char*)visits, T_PREFIX)))
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder {
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder message((-4, "pathnext: -- %s [0x%08x]", NiL, visits ? *visits : 0L));
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder return 0;
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder }
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder /*
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder * we found a viewpath entry
0216a1580abf46ed8981f25e89d6fd99b2944ac2Christian Maeder * check if stuff after extra needs to be shifted
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder */
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder
53301de22afd7190981b363b57c48df86fcb50f7Christian Maeder vpathlen = T_VALSIZE(vpath);
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder cp = sp + vpath->keysize;
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder shift = vpathlen - (cp - sp);
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder if (shift < 0)
1eb10c0c30323eed3cc21082fd242cd09a612dc5Christian Maeder {
fa45d098e1c9d468f128be9505eb7e5b2705b304Christian Maeder /*
25612a7b3ce708909298d5426406592473880a20Christian Maeder * shift left
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder */
35cd0c10843c2cdbbe29f00a2a5d7e5e4f2d0064Christian Maeder
c1db3d36c29a6324745a86dbcba18b8e4cd9f338Christian Maeder if (cp < ep)
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian Maeder strcopy(sp + vpathlen + 1, cp + 1);
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder }
7de39d39bc1700cc8a9bb9df90b920aad9e18d4aChristian Maeder else if (shift > 0)
1eb10c0c30323eed3cc21082fd242cd09a612dc5Christian Maeder {
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder /*
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder * shift right extra
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian Maeder */
18b709ce961d68328da768318dcc70067f066d86Christian Maeder
f454c20b6c126bea7d31d400cc8824b9ee8cc6eaChristian Maeder if (extra)
18b709ce961d68328da768318dcc70067f066d86Christian Maeder {
ac142c1b088711f911018d8108a64be80b2f2a58Christian Maeder for (tmp = extra + strlen(extra); tmp >= extra; tmp--)
9c5b1136299d9052e4e995614a3a36a051a2682fChristian Maeder tmp[shift] = *tmp;
0216a1580abf46ed8981f25e89d6fd99b2944ac2Christian Maeder extra += shift;
0216a1580abf46ed8981f25e89d6fd99b2944ac2Christian Maeder }
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder
36c6cc568751e4235502cfee00ba7b597dae78dcChristian Maeder /*
9c5b1136299d9052e4e995614a3a36a051a2682fChristian Maeder * shift right cp
9c5b1136299d9052e4e995614a3a36a051a2682fChristian Maeder */
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian Maeder
0216a1580abf46ed8981f25e89d6fd99b2944ac2Christian Maeder if (cp < ep)
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian Maeder {
797f811e57952d59e73b8cd03b667eef276db972Christian Maeder for (tmp = ep; tmp > cp; tmp--)
11d6ec73ee5550e00cb56b221bdbeb709142e779Christian Maeder tmp[shift] = *tmp;
fe5dbb45b6a8abf34375b4bc5f2a81cda664c0e4Christian Maeder strcopy(sp + vpathlen + 1, cp + shift + 1);
797f811e57952d59e73b8cd03b667eef276db972Christian Maeder }
797f811e57952d59e73b8cd03b667eef276db972Christian Maeder }
18b709ce961d68328da768318dcc70067f066d86Christian Maeder
42c01284bba8d7c8d995c8dfb96ace57d28ed1bcTill Mossakowski /*
369454f9b2dbea113cbb40544a9b0f31425b2c69Christian Maeder * insert vpath
b52ad1aed6b1eb8b8416aaf100695f54ea59aea0Christian Maeder */
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder
18b709ce961d68328da768318dcc70067f066d86Christian Maeder strncpy(sp, vpath->val, vpathlen);
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian Maeder sp[vpathlen] = cp < ep ? '/' : 0;
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian Maeder cp = sp;
3daa82a175c7cfabf22455aa77c4beda327404e4Christian Maeder if (extra)
3daa82a175c7cfabf22455aa77c4beda327404e4Christian Maeder strcpy(sp = ep + shift, extra);
3daa82a175c7cfabf22455aa77c4beda327404e4Christian Maeder state.path.level++;
3daa82a175c7cfabf22455aa77c4beda327404e4Christian Maeder message((-4, "pathnext: -- %s [level=%d visits=0x%08x]", cp, state.path.level, visits ? *visits : 0L));
b52ad1aed6b1eb8b8416aaf100695f54ea59aea0Christian Maeder return sp;
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder}
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder
d5c415f6373274fed04d83b9322891f3b82e9c26Christian Maeder/*
22fc8a1bd14dc53c5c7f482d2e0c04eb5ee4beb4Christian Maeder * search for the instance name for path sp
22fc8a1bd14dc53c5c7f482d2e0c04eb5ee4beb4Christian Maeder * and place in instname
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder * 0 returned when instances exhausted
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder * if create is non-zero, use name before the first slash as instance
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder * name, and do not check existence.
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian Maeder */
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian Maeder
adfdcfa67b7f12df6df7292e238c3f9a4b637980Christian Maederint
adfdcfa67b7f12df6df7292e238c3f9a4b637980Christian Maederinstance(register char* sp, char* instname, struct stat* st, int create)
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder{
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder register char* cp;
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian Maeder register char* mp;
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian Maeder register char* mapnext;
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian Maeder register int size;
f454c20b6c126bea7d31d400cc8824b9ee8cc6eaChristian Maeder int maps;
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian Maeder char* mapend;
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian Maeder Map_t* map;
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian Maeder
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder cp = instname++;
f454c20b6c126bea7d31d400cc8824b9ee8cc6eaChristian Maeder mapnext = mapend = 0;
9e0472be46104307b974fe5079bf5cc9e94a1a96Christian Maeder maps = 0;
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian Maeder if (state.vmap.size)
369454f9b2dbea113cbb40544a9b0f31425b2c69Christian Maeder {
11d6ec73ee5550e00cb56b221bdbeb709142e779Christian Maeder while (*--cp != '/');
9c5b1136299d9052e4e995614a3a36a051a2682fChristian Maeder if (!create) cp -= 4;
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder }
ac142c1b088711f911018d8108a64be80b2f2a58Christian Maeder else cp = sp;
fcec1ffa4a95dbc47cf23f75e6843ceff93a925eChristian Maeder for (;;)
fcec1ffa4a95dbc47cf23f75e6843ceff93a925eChristian Maeder {
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian Maeder if ((mp = mapnext) >= mapend)
b52ad1aed6b1eb8b8416aaf100695f54ea59aea0Christian Maeder {
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian Maeder /*
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian Maeder * look for next vmap
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian Maeder */
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian Maeder
fcec1ffa4a95dbc47cf23f75e6843ceff93a925eChristian Maeder while (cp > sp)
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder {
f454c20b6c126bea7d31d400cc8824b9ee8cc6eaChristian Maeder map = search(&state.vmap, sp, cp - sp, NiL, 0);
b52ad1aed6b1eb8b8416aaf100695f54ea59aea0Christian Maeder if (cp > sp + 1)
65835942d66905c377fa503e0d577df5aade58feChristian Maeder {
65835942d66905c377fa503e0d577df5aade58feChristian Maeder while (*--cp != '/');
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder while (cp > sp && cp[-1] == '/') cp--;
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder if (cp == sp) cp++;
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder }
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder else cp = sp;
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder if (map && (!create || *map->val != '/'))
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian Maeder goto match;
b603f34b79bc0992e5d74f484e5bdc9f9c2346c6Christian Maeder }
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder if (!create)
aff01ee50b66032469c232e00c945d1fd4f57d1bChristian Maeder {
fcec1ffa4a95dbc47cf23f75e6843ceff93a925eChristian Maeder strcpy(instname, state.vdefault);
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian Maeder maps++;
5581c4644d91dcb9b7e2e7f6052f7cbf5f97b6deChristian Maeder if (!LSTAT(sp, st))
goto found;
}
return 0;
match:
mp = map->val;
size = T_VALSIZE(map);
mapend = mp + size;
if (create)
{
while (mp < mapend && *mp!='/') mp++;
if ((size = mp - map->val) <= 0)
return 0;
memcpy(instname, map->val, size);
instname[size] = 0;
maps++;
goto found;
}
if (*mp == '/') mp++;
}
for (mapnext = mp; mapnext < mapend; mapnext++)
if (*mapnext == '/')
break;
if ((size = mapnext - mp) <= 0) continue;
memcpy(instname, mp, size = mapnext - mp);
instname[size] = 0;
while (mapnext < mapend && *mapnext == '/') mapnext++;
maps++;
if (!LSTAT(sp, st))
goto found;
}
/*NOTREACHED*/
found:
if (maps > 1)
state.path.level |= INSTANCE;
return 1;
}