mstrcmp.c

来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 296 行

C
296
字号
#ifndef lintstatic	char	*sccsid = "@(#)mstrcmp.c	4.1	(ULTRIX)	7/17/90";#endif	lint/**************************************************************** *								* *			Copyright (c) 1985 by			* *		Digital Equipment Corporation, Maynard, MA	* *			All rights reserved.			* *								* *   This software is furnished under a license and may be used * *   and copied  only  in accordance with the terms of such	* *   license and with the  inclusion  of  the  above  copyright * *   notice. This software  or  any  other copies thereof may	* *   not be provided or otherwise made available to any other	* *   person.  No title to and ownership of the software is	* *   hereby transferred.					* *								* *   The information in this software is subject to change	* *   without  notice  and should not be construed as a		* *   commitment by Digital  Equipment Corporation.		* *								* *   Digital assumes  no responsibility   for  the use  or	* *   reliability of its software on equipment which is not	* *   supplied by Digital.					* *								* ****************************************************************//**//* * *	File name: * *		mstrcmp.c * *	Source file description: * *		Compares two strings while expanding META *		characters (*, ?, etc). *		Used by the Labeled Tape Facility to match *		user input file names and file names read *		from input device. * *	Functions: * *		mstrcmp()	The comparison routine. * *	Usage: * *		n/a * *	Compile: * *	    cc -O -c mstrcmp.c		<- For Ultrix-32/32m * *	    cc CFLAGS=-DU11-O mstrcmp.c	<- For Ultrix-11 * *	Modification history: *	~~~~~~~~~~~~~~~~~~~~ * *	revision			comments *	--------	----------------------------------------------- *	  01.0		11-April-85	Ray Glaser *			Create initial version. *	 */ /*  * ->	Local includes  */#include "ltfdefs.h"/**//* * * Function: * *	mstrcmp * * Function Description: * *	Compares strings 's' and 't' while expanding metacharacters *	in 't'. String  's'  is the file name from tape and 't' is *	the user input string. * * * Arguments: * *	char	*s	File name string read from the input device. *	char	*t	File name string as input by the user. * * Return values: * *	int	0	If the two string are logically equiv. *	int	-1	If the two string are NOT equivalent. * *	int	Wildc	False if no wildcards were seen in the matched *			string, else non-zero. * * Side Effects: * *	n/a *	 */mstrcmp(s, t)	char *s, *t;{/*------*\   Code\*------*//* Default to no wild cards in file name. */Wildc = FALSE;while(1) {	if(*s == *t) {		if(*s == 0)			return(0);		s++;		t++;		continue;	}/*E if *s == *t ..*/	/*	 * Character *s != character *t.	 * The following says  "IF" we are not at the end	 * of user input string (t) return "no-match".	 * -or- We are at the end of the tape name (s) and	 * user input is "NOT" a wild *, also say "no-match".	 */	if ((! *t) || ((! *s) && *t != '*'))		 return(-1);	/*	 * *s character != *t  character  _and_	 * there are more characters in at	 * least one of the two strings.	 *	 * Switch off of the character in the user	 * input string.	 */	switch (*t) {		case '?':			Wildc++;			t++;			s++;			break;		case '[':			while (*++t != ']') {			    if (*s == *t || *t == '-'  &&				    *s >= *(t-1) && *s <= *(t+1)) {				s++;				while(*t++ != ']')					;				break;			    }/*T if *s == *t ..*/			}/*E while *++t != [ */			if (*t == ']')			    return(-1);			break;			/* Match any string of chctrs up to the position		 * of the wild card '*' meta character.		 */		 case '*':			Wildc++;			/* The following "while" filters out multiple			 * consecutive occurances of the wild card			 * "*" meta character.			 */			while (*++t == '*')			    ;			/* If we have now exhausted the user input			 * string return a "match".			 */			if (! *t )				return(0);/* At this point: * * We have seen an '*' in usr input, and have skiped over it. * * Discard leading leading chctrs in  "s"  due  to the  "*"  * seen in  "t"  & find the next match of real chctrs in the two * strings to resume direct comparisons. */			for ( ;; ) {			    char *ss;			    while (*s != *t) {			    	/* If out of tape file name, say			         * strings .ne. ..			         */				if (! *s )			            return(-1);				s++;			    }/*E while *s != *t */			    /*			     * Save a pointer to the first			     * new matching chctrs.			     */			    ss = s;			    while (*s == *t) {				/* If out of tape name. Say names				 * are ===.?				 */				if (! *s )					return(0);				s++;				t++;			    }/*E while *s */			    /* Break out of the for  ;;  loop			     * if another meta character is seen.			     */			    if (*t == '*' || *t == '?' || *t == '[')				    break;/* Reset 's' to point to the chctr after the last match chctr * in the 2 strings & go back to  top-level of compare logic * now that we have seen a  non-match. * * The previous note and the  next 'break' serve to highlite * that "given" the user input of  *.dat, the code was pulling * file names off the tape that had any occurance of the * string 'dat' in the suffix.   ie. the file names: * *    elle.update, *    file.dat *    file.withdatin * * would all get dragged in from the input device when all that was * wanted was the file: * *    file.dat */			    s = ss+1;			    /* Break out of the for ;; loop.			     */			    break;			}/*E for ;; ..*/			/* Break out of "switch (*t)"			*/			break;		/* The default for "switch (*t)" says that the		 * non-matching character in "t" was NOT a meta		 * character, therefor, return a non-match.		 */		default:			return(-1);	}/*E switch (*t) ..*/}/*E while (1) ..*/}/*E mstrcmp() ..*//**\\**\\**\\**\\**\\**  EOM  mstrcmp.c  **\\**\\**\\**\\**\\*//**\\**\\**\\**\\**\\**  EOM  mstrcmp.c  **\\**\\**\\**\\**\\*/

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?