vcalias.c revision 3f54fd611f536639ec30dd53c48e5ec1897cc7d9
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder/***********************************************************************
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly* *
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly* This software is part of the ast package *
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly* Copyright (c) 2003-2011 AT&T Intellectual Property *
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly* and is licensed under the *
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu* Eclipse Public License, Version 1.0 *
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly* by AT&T Intellectual Property *
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly* *
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly* A copy of the License is available at *
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly* http://www.eclipse.org/org/documents/epl-v10.html *
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly* (with md5 checksum b35adb5213ca9657e911e9befb180842) *
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly* *
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly* Information and Software Systems Research *
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly* AT&T Research *
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly* Florham Park NJ *
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly* *
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder* Phong Vo <kpv@research.att.com> *
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder* *
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder***********************************************************************/
e90dc723887d541f809007ae81c9bb73ced9592eChristian Maeder#include "vchdr.h"
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly#include <fnmatch.h>
56899f6457976a2ee20f6a23f088cb5655b15715Liam O'Reilly
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder/* Collection of functions to translate command line arguments,
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder** aliases, etc. to list of transforms and arguments suitable for
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly** data tranformation by vcsfio().
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly**
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly** The syntax is like this:
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder** Transformation Method1,Method2,...
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder** Method method.arg1.arg2....
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder** arg value
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly** arg name=value
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder** method alphanumeric string specifying a transform
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder** name alphanumeric string specifying an argument
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly** value any string, quotable with [], C-style chars
c0833539c8cf577dd3f2497792fbdd818442744cChristian Maeder**
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly** Written by Kiem-Phong Vo.
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly*/
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly#ifndef PATH_MAX
fa373bc327620e08861294716b4454be8d25669fChristian Maeder#define PATH_MAX (4*1024)
036ecbd8f721096321f47cf6a354a9d1bf3d032fChristian Maeder#endif
fa373bc327620e08861294716b4454be8d25669fChristian Maeder#define ALIASES "lib/vcodex/aliases"
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder#define VCZIPRC ".vcziprc"
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reillytypedef struct _vcalias_s Vcalias_t;
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reillystruct _vcalias_s
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly{ Vcalias_t* next;
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly char* name; /* name of the alias */
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly char* value; /* what it should expand to */
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly};
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederstatic char *Dfltalias[] =
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder{
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder "tv = ama,table,mtf,rle.0,huffgroup",
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder "tss7 = ss7,table,mtf,rle.0,huffpart",
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder "tnls = ama.nls,rtable,mtf,rle.0,huffgroup",
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder "tnl = ama.nl,table,mtf,rle.0,huffgroup",
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder "tbdw = bdw,ama,table,mtf,rle.0,huffgroup",
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder "t = table,mtf,rle.0,huffgroup",
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder "rte = strip.nl.head=1.tail=1,rdb.pad.plain.whole,table,mtf,rle.0,huffgroup",
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder "rt = rtable,mtf,rle.0,huffgroup",
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder "qv = ama,transpose,rle,huffman",
4314e26a12954cb1c9be4dea10aa8103edac5bbbChristian Maeder "qnl = ama.nl,transpose,rle,huffman",
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder "q = transpose,rle,huffman",
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder "netflow = netflow,mtf,rle.0,huffgroup",
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly "flatrdb = rdb,bwt,mtf,rle.0,huffgroup",
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly "fixedrdb = rdb.full,table,mtf,rle.0,huffgroup",
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly "dna = sieve.reverse.map=ATGCatgc,huffgroup",
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder "delta = sieve.delta,bwt,mtf,rle.0,huffgroup",
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder "b = bwt,mtf,rle.0,huffgroup",
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder 0
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder};
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederstatic Vcalias_t *Alias;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reillystatic Vcalias_t *Fname;
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly
fa373bc327620e08861294716b4454be8d25669fChristian Maeder/* create aliases, text lines of the form 'name = value' */
fa373bc327620e08861294716b4454be8d25669fChristian Maeder/* create file name extension mappings, text lines of the form 'pattern : value' */
fa373bc327620e08861294716b4454be8d25669fChristian Maeder#if __STD_C
fa373bc327620e08861294716b4454be8d25669fChristian Maederstatic void zipalias(char* s)
fa373bc327620e08861294716b4454be8d25669fChristian Maeder#else
fa373bc327620e08861294716b4454be8d25669fChristian Maederstatic Vcalias_t* zipalias(s)
fa373bc327620e08861294716b4454be8d25669fChristian Maederchar* s; /* spec of new aliases */
fa373bc327620e08861294716b4454be8d25669fChristian Maeder#endif
fa373bc327620e08861294716b4454be8d25669fChristian Maeder{
fa373bc327620e08861294716b4454be8d25669fChristian Maeder Vcalias_t *al, **list;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder ssize_t a, v, w, n;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder for(n = s ? strlen(s) : 0; n > 0; )
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder { /* skip starting blanks */
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly while(n > 0 && (isblank(*s) || *s == '\n') )
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly { s += 1; n -= 1; }
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder if(!isalnum(*s) ) /* invalid alias specification */
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly goto skip_line;
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder /* get the name */
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder for(a = 0; a < n; ++a)
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder if(!isalnum(s[a]))
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder break;
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder for(v = a; v < n; ++v)
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder if(!isblank(s[v]) )
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder break;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder if(s[v] == '=')
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder list = &Alias;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder else if(s[v] == ':')
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder list = &Fname;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder else
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder goto skip_line;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder /* get the value */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder for(v += 1; v < n; ++v)
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder if(!isblank(s[v]) )
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder break;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder for(w = v; w < n; ++w)
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder if(isblank(s[w]) )
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder break;
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder if(w == v)
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder goto skip_line;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder if(!(al = (Vcalias_t*)malloc(sizeof(Vcalias_t) + a+1 + (w-v)+1)) )
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder break;
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder al->name = (char*)(al+1);
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder al->value = al->name + a+1;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder memcpy(al->name, s, a); al->name[a] = 0;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder memcpy(al->value, s+v, w-v); al->value[w-v] = 0;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder al->next = *list;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder *list = al;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder skip_line:
4314e26a12954cb1c9be4dea10aa8103edac5bbbChristian Maeder for(; n > 0; --n, ++s)
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder if(*s == '\n')
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder break;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder }
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder}
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder/* initialize a list of aliases */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#if __STD_C
4314e26a12954cb1c9be4dea10aa8103edac5bbbChristian Maedervoid vcaddalias(char** dflt)
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#else
648fe1220044aac847acbdfbc4155af5556063ebChristian Maedervoid vcaddalias(dflt)
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederchar** dflt; /* list of default aliases */
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly#endif
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder{
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder ssize_t z;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder Sfio_t *sf;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder char *sp, file[PATH_MAX];
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
e0f1794e365dd347e97b37d7d22b2fce27296fa1Christian Maeder if(!Alias)
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder {
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#if _PACKAGE_ast /* AST alias convention */
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder if(pathpath(ALIASES, "", PATH_REGULAR, file, sizeof(file)) && (sf = sfopen(0, file, "")) )
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder { while((sp = sfgetr(sf, '\n', 1)) )
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder zipalias(sp);
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder sfclose(sf);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder }
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder#endif
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder /* $HOME/.vcziprc */
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder if((sp = getenv("HOME")) && (z = strlen(sp)) > 0 && (z+1+strlen(VCZIPRC)+1) <= PATH_MAX )
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder { memcpy(file, sp, z);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder sp[z] = '/';
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder strcpy(file+z+1, VCZIPRC);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder if((sf = sfopen(0, file, "")) )
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder { while((sp = sfgetr(sf, '\n', 1)) )
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder zipalias(sp);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder sfclose(sf);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder }
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder }
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder for(z = 0; sp = Dfltalias[z]; ++z)
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly zipalias(sp);
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly }
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reilly /* other default aliases */
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly if(dflt)
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly for(z = 0; (sp = dflt[z]); ++z)
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly zipalias(sp);
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly}
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly/* map an alias. Arguments are passed onto the first method of the aliased spec */
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly#if __STD_C
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reillychar* vcgetalias(char* spec, char* meth, ssize_t mtsz)
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly#else
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reillychar* vcgetalias(spec, meth, mtsz)
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reillychar* spec; /* name.arg1.arg2... */
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reillychar* meth; /* buffer for methods */
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reillyssize_t mtsz; /* buffer size */
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reilly#endif
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly{
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly char *args, *rest, name[1024];
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly ssize_t n, a, r;
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder Vcalias_t *alias;
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder if(!Alias)
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder vcaddalias(NIL(char**));
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly if(!(alias = Alias) || !spec)
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly return spec;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly /* must be of the form xxx.yyy.zzz... only */
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly if(!(args = vcsubstring(spec, VC_METHSEP, name, sizeof(name), 0)) || *args != 0 )
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly return spec;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly /* find the extent of the alias name */
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reilly for(n = 0; name[n]; ++n)
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly if(name[n] == 0 || name[n] == VC_ARGSEP)
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly break;
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly args = name[n] ? name+n+1 : name+n;
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly name[n] = 0;
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly /* see if that matches an alias */
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly for(; alias; alias = alias->next)
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly if(strcmp(alias->name, name) == 0)
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly break;
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly if(!alias)
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly return spec;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly if(!*args || !meth || !mtsz) /* no new arguments */
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly return alias->value;
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly /* copy the spec of the first transform to meth[] */
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly if(!(rest = vcsubstring(alias->value, VC_METHSEP, meth, mtsz, 0)) )
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly return spec;
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly n = strlen(meth);
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly a = strlen(args);
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly r = strlen(rest);
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reilly if(n+1+a+1+r > mtsz) /* not enough room */
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reilly return spec;
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly /* copy additional arguments */
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly meth[n] = VC_ARGSEP;
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder strcpy(meth+n+1, args);
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder if(r > 0) /* copy the rest of the alias */
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder { meth[n+1+a] = VC_METHSEP;
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder strcpy(meth+n+1+a+1, rest);
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder }
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder return meth;
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder}
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly/* match a file name */
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly#if __STD_C
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maederchar* vcgetfname(char* name, char* meth, ssize_t mtsz)
fa373bc327620e08861294716b4454be8d25669fChristian Maeder#else
fa373bc327620e08861294716b4454be8d25669fChristian Maederchar* vcgetfname(name, meth, mtsz)
fa373bc327620e08861294716b4454be8d25669fChristian Maederchar* name; /* file name to match */
fa373bc327620e08861294716b4454be8d25669fChristian Maederchar* meth; /* buffer for methods */
fa373bc327620e08861294716b4454be8d25669fChristian Maederssize_t mtsz; /* buffer size */
fa373bc327620e08861294716b4454be8d25669fChristian Maeder#endif
fa373bc327620e08861294716b4454be8d25669fChristian Maeder{
fa373bc327620e08861294716b4454be8d25669fChristian Maeder Vcalias_t *al;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder if(!Alias)
fa373bc327620e08861294716b4454be8d25669fChristian Maeder vcaddalias(NIL(char**));
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder for(al = Fname; al; al = al->next)
fa373bc327620e08861294716b4454be8d25669fChristian Maeder if(fnmatch(al->name, name, FNM_PATHNAME) == 0 )
fa373bc327620e08861294716b4454be8d25669fChristian Maeder {
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder if(!meth || mtsz <= strlen(al->value))
fa373bc327620e08861294716b4454be8d25669fChristian Maeder break;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder strcpy(meth, al->value);
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder return meth;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder }
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder return NIL(char*);
fa373bc327620e08861294716b4454be8d25669fChristian Maeder}
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder/* walk an alias list */
fa373bc327620e08861294716b4454be8d25669fChristian Maeder#if __STD_C
fa373bc327620e08861294716b4454be8d25669fChristian Maederstatic int vcwalklist(Vcalias_t* al, Vcwalk_f walkf, Void_t* disc)
fa373bc327620e08861294716b4454be8d25669fChristian Maeder#else
fa373bc327620e08861294716b4454be8d25669fChristian Maederstatic int vcwalklist(al, walkf, disc)
fa373bc327620e08861294716b4454be8d25669fChristian MaederVcalias_t* al;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian MaederVcwalk_f walkf;
fa373bc327620e08861294716b4454be8d25669fChristian MaederVoid_t* disc;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder#endif
fa373bc327620e08861294716b4454be8d25669fChristian Maeder{
fa373bc327620e08861294716b4454be8d25669fChristian Maeder int rv;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder if(!walkf)
fa373bc327620e08861294716b4454be8d25669fChristian Maeder return -1;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder for(; al; al = al->next)
fa373bc327620e08861294716b4454be8d25669fChristian Maeder if((rv = (*walkf)((Void_t*)0, al->name, al->value, disc)) < 0 )
fa373bc327620e08861294716b4454be8d25669fChristian Maeder return rv;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder return 0;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder}
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder/* walk the list of aliases */
fa373bc327620e08861294716b4454be8d25669fChristian Maeder#if __STD_C
fa373bc327620e08861294716b4454be8d25669fChristian Maederint vcwalkalias(Vcwalk_f walkf, Void_t* disc)
56899f6457976a2ee20f6a23f088cb5655b15715Liam O'Reilly#else
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maederint vcwalkalias(walkf, disc)
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian MaederVcwalk_f walkf;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian MaederVoid_t* disc;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder#endif
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder{
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder if(!Alias)
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder vcaddalias(NIL(char**));
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder return vcwalklist(Alias, walkf, disc);
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder}
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder/* walk the list of fnames */
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder#if __STD_C
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maederint vcwalkfname(Vcwalk_f walkf, Void_t* disc)
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder#else
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maederint vcwalkfname(walkf, disc)
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian MaederVcwalk_f walkf;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian MaederVoid_t* disc;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder#endif
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder{
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder if(!Alias)
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly vcaddalias(NIL(char**));
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder return vcwalklist(Fname, walkf, disc);
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder}
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder