171 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			171 lines
		
	
	
		
			5.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| /*
 | |
|     Copyright (c) 2006-2020 Chung, Hyung-Hwan. All rights reserved.
 | |
| 
 | |
|     Redistribution and use in source and binary forms, with or without
 | |
|     modification, are permitted provided that the following conditions
 | |
|     are met:
 | |
|     1. Redistributions of source code must retain the above copyright
 | |
|        notice, this list of conditions and the following disclaimer.
 | |
|     2. Redistributions in binary form must reproduce the above copyright
 | |
|        notice, this list of conditions and the following disclaimer in the
 | |
|        documentation and/or other materials provided with the distribution.
 | |
| 
 | |
|     THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
 | |
|     IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
 | |
|     OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
 | |
|     IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
 | |
|     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 | |
|     NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 | |
|     DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 | |
|     THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 | |
|     (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
 | |
|     THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 | |
|  */
 | |
| 
 | |
| /* 
 | |
|  * Do NOT edit glob.c. Edit glob.c.m4 instead.
 | |
|  * 
 | |
|  * Generate gem-glob.c with m4
 | |
|  *   $ m4 gem-glob.c.m4 > gem-glob.c  
 | |
|  */
 | |
| 
 | |
| #include "hawk-prv.h"
 | |
| #include <hawk-chr.h>
 | |
| #include <hawk-ecs.h>
 | |
| #include <hawk-dir.h>
 | |
| #include <hawk-glob.h>
 | |
| 
 | |
| #include "syscall.h"
 | |
| 
 | |
| #define NO_RECURSION 1
 | |
| 
 | |
| enum segment_type_t
 | |
| {
 | |
|         NONE,
 | |
|         ROOT,
 | |
|         NORMAL
 | |
| };
 | |
| typedef enum segment_type_t segment_type_t;
 | |
| 
 | |
| 
 | |
| #define IS_ESC(c) HAWK_FNMAT_IS_ESC(c)
 | |
| #define IS_SEP(c) HAWK_FNMAT_IS_SEP(c)
 | |
| #define IS_NIL(c) ((c) == '\0')
 | |
| #define IS_SEP_OR_NIL(c) (IS_SEP(c) || IS_NIL(c))
 | |
| 
 | |
| /* this macro only checks for top-level wild-cards among these.
 | |
|  *  *, ?, [], !, -
 | |
|  * see str-fnmat.c for more wild-card letters
 | |
|  */
 | |
| #define IS_WILD(c) ((c) == '*' || (c) == '?' || (c) == '[')
 | |
| 
 | |
| 
 | |
| static hawk_bch_t* wcs_to_mbuf (hawk_gem_t* g, const hawk_uch_t* wcs, hawk_becs_t* mbuf)
 | |
| {
 | |
| 	hawk_oow_t ml, wl;
 | |
| 
 | |
| 	if (hawk_gem_convutobcstr(g, wcs, &wl, HAWK_NULL, &ml) <= -1 ||
 | |
| 	    hawk_becs_setlen(mbuf, ml) == (hawk_oow_t)-1) return HAWK_NULL;
 | |
| 
 | |
| 	hawk_gem_convutobcstr (g, wcs, &wl, HAWK_BECS_PTR(mbuf), &ml);
 | |
| 	return HAWK_BECS_PTR(mbuf);
 | |
| }
 | |
| 
 | |
| #if defined(_WIN32) && !defined(INVALID_FILE_ATTRIBUTES)
 | |
| #define INVALID_FILE_ATTRIBUTES ((DWORD)-1)
 | |
| #endif
 | |
| 
 | |
| static int upath_exists (hawk_gem_t* g, const hawk_uch_t* name, hawk_becs_t* mbuf)
 | |
| {
 | |
| #if defined(_WIN32)
 | |
| 	return (GetFileAttributesW(name) != INVALID_FILE_ATTRIBUTES)? 1: 0;
 | |
| 
 | |
| #elif defined(__OS2__)
 | |
| 	FILESTATUS3 fs;
 | |
| 	APIRET rc;
 | |
| 	const hawk_bch_t* mptr;
 | |
| 
 | |
| 	mptr = wcs_to_mbuf(g, name, mbuf);
 | |
| 	if (HAWK_UNLIKELY(!mptr)) return -1;
 | |
| 
 | |
| 	rc = DosQueryPathInfo(mptr, FIL_STANDARD, &fs, HAWK_SIZEOF(fs));
 | |
| 	return (rc == NO_ERROR)? 1: ((rc == ERROR_PATH_NOT_FOUND)? 0: -1);
 | |
| 
 | |
| #elif defined(__DOS__)
 | |
| 	unsigned int x, attr;
 | |
| 	const hawk_bch_t* mptr;
 | |
| 
 | |
| 	mptr = wcs_to_mbuf(g, name, mbuf);
 | |
| 	if (HAWK_UNLIKELY(!mptr)) return -1;
 | |
| 
 | |
| 	x = _dos_getfileattr (mptr, &attr);
 | |
| 	return (x == 0)? 1: ((errno == ENOENT)? 0: -1);
 | |
| 
 | |
| #elif defined(macintosh)
 | |
| 	HFileInfo fpb;
 | |
| 	const hawk_bch_t* mptr;
 | |
| 
 | |
| 	mptr = wcs_to_mbuf(g, name, mbuf);
 | |
| 	if (HAWK_UNLIKELY(!mptr)) return -1;
 | |
| 
 | |
| 	HAWK_MEMSET (&fpb, 0, HAWK_SIZEOF(fpb));
 | |
| 	fpb.ioNamePtr = (unsigned char*)mptr;
 | |
| 
 | |
| 	return (PBGetCatInfoSync ((CInfoPBRec*)&fpb) == noErr)? 1: 0;
 | |
| #else
 | |
| 	struct stat st;
 | |
| 	const hawk_bch_t* mptr;
 | |
| 	int t;
 | |
| 
 | |
| 	mptr = wcs_to_mbuf(g, name, mbuf);
 | |
| 	if (HAWK_UNLIKELY(!mptr)) return -1;
 | |
| 
 | |
| 	#if defined(HAVE_LSTAT)
 | |
| 	t = HAWK_LSTAT(mptr, &st);
 | |
| 	#else
 | |
| 	t = HAWK_STAT(mptr, &st);/* use stat() if no lstat() is available. */
 | |
| 	#endif
 | |
| 	return (t == 0);
 | |
| #endif
 | |
| }
 | |
| 
 | |
| static int bpath_exists (hawk_gem_t* g, const hawk_bch_t* name, hawk_becs_t* mbuf)
 | |
| {
 | |
| #if defined(_WIN32)
 | |
| 	return (GetFileAttributesA(name) != INVALID_FILE_ATTRIBUTES)? 1: 0;
 | |
| #elif defined(__OS2__)
 | |
| 
 | |
| 	FILESTATUS3 fs;
 | |
| 	APIRET rc;
 | |
| 	rc = DosQueryPathInfo(name, FIL_STANDARD, &fs, HAWK_SIZEOF(fs));
 | |
| 	return (rc == NO_ERROR)? 1: ((rc == ERROR_PATH_NOT_FOUND)? 0: -1);
 | |
| 
 | |
| #elif defined(__DOS__)
 | |
| 	unsigned int x, attr;
 | |
| 	x = _dos_getfileattr(name, &attr);
 | |
| 	return (x == 0)? 1: ((errno == ENOENT)? 0: -1);
 | |
| 
 | |
| #elif defined(macintosh)
 | |
| 	HFileInfo fpb;
 | |
| 	HAWK_MEMSET (&fpb, 0, HAWK_SIZEOF(fpb));
 | |
| 	fpb.ioNamePtr = (unsigned char*)name;
 | |
| 	return (PBGetCatInfoSync((CInfoPBRec*)&fpb) == noErr)? 1: 0;
 | |
| #else
 | |
| 	struct stat st;
 | |
| 	int t;
 | |
| 	#if defined(HAVE_LSTAT)
 | |
| 	t = HAWK_LSTAT(name, &st);
 | |
| 	#else
 | |
| 	t = HAWK_STAT(name, &st); /* use stat() if no lstat() is available. */
 | |
| 	#endif
 | |
| 	return (t == 0);
 | |
| #endif
 | |
| }
 | |
| 
 | |
| dnl
 | |
| dnl ---------------------------------------------------------------------------
 | |
| include(`gem-glob.m4')dnl
 | |
| dnl ---------------------------------------------------------------------------
 | |
| fn_glob(hawk_gem_uglob, hawk_uch_t, hawk_ucs_t, hawk_uecs, HAWK_UECS, hawk_gem_uglob_cb_t, upath_exists, hawk_fnmat_ucstr_uchars, __u)
 | |
| fn_glob(hawk_gem_bglob, hawk_bch_t, hawk_bcs_t, hawk_becs, HAWK_BECS, hawk_gem_bglob_cb_t, bpath_exists, hawk_fnmat_bcstr_bchars, __b)
 |