da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin/***********************************************************************
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* This software is part of the ast package *
3e14f97f673e8a630f076077de35afdd43dc1587Roger A. Faulkner* Copyright (c) 1982-2010 AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* and is licensed under the *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Common Public License, Version 1.0 *
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin* by AT&T Intellectual Property *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* A copy of the License is available at *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* (with md5 checksum 059e8cd6165cb4c31e351f2b69388fd9) *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Information and Software Systems Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* AT&T Research *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* Florham Park NJ *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin* David Korn <dgk@research.att.com> *
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin***********************************************************************/
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * File name expansion
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * David Korn
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * AT&T Labs
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* KSHELL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin static int scantree(Dt_t*,const char*, struct argnod**);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* KSHELL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * This routine builds a list of files that match a given pathname
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Uses external routine strgrpmatch() to match each component
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * A leading . must match explicitly
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return(0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint path_expand(const char *pattern, struct argnod **arghead)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin flags = GLOB_AUGMENTED|GLOB_NOCHECK|GLOB_NOSORT|GLOB_STACK|GLOB_LIST|GLOB_DISC;
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin extra += scantree(shp->alias_tree,pattern,arghead);
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin extra += scantree(shp->fun_tree,pattern,arghead);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* KSHELL */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * For bash, FIGNORE is a colon separated list of suffixes to
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * ignore when doing filename/command completion.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * GLOBIGNORE is similar to ksh FIGNORE, but colon separated
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * instead of being an augmented shell pattern.
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * Generate shell patterns out of those here.
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin GLOBIGNORENOD = nv_open("GLOBIGNORE",shp->var_tree,0);
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if(!sh_isstate(SH_FCOMPLETE) && sh_isoption(SH_DOTGLOB))
7c2fbfb345896881c631598ee3852ce9ce33fb07April Chin gp->gl_fignore = nv_getval(sh_scoped(shp,FIGNORENOD));
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(ap= (struct argnod*)gp->gl_list; ap; ap = ap->argnxt.ap)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * scan tree and add each name that matches the given pattern
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinstatic int scantree(Dt_t *tree, const char *pattern, struct argnod **arghead)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin for(;np && !nv_isnull(np);(np = (Namval_t*)dtnext(tree,np)))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * file name completion
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * generate the list of files found by adding an suffix to end of name
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin * The number of matches is returned
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint path_complete(const char *name,register const char *suffix, struct argnod **arghead)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return -1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chinint path_generate(struct argnod *todo, struct argnod **arghead)
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin assume todo!=0;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin return count satisfying count>=1;
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* first search for {...,...} */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin else if((cp[2]=='}' || cp[2]=='.' && cp[3]=='.') && ((*pat>='a' && *pat<='z' && cp[1]>='a' && cp[1]<='z') || (*pat>='A' && *pat<='Z' && cp[1]>='A' && cp[1]<='Z')))
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\\':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* insert on stack */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin /* generate each pattern and put on the todo list */
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin case '\\':
da2e3ebdc1edfbc5028edf1354e7dd2fa69a7968chin#endif /* SHOPT_BRACEPAT */