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)
|