Merge pull request #277 from Blizzard/path-wildcards-to-c
path.wildcards -> C
This commit is contained in:
commit
b5c4108129
@ -237,30 +237,3 @@
|
||||
return p:match("^(.*)"..ext.."$")..newext
|
||||
end
|
||||
|
||||
|
||||
|
||||
--
|
||||
-- Converts from a simple wildcard syntax, where * is "match any"
|
||||
-- and ** is "match recursive", to the corresponding Lua pattern.
|
||||
--
|
||||
-- @param pattern
|
||||
-- The wildcard pattern to convert.
|
||||
-- @returns
|
||||
-- The corresponding Lua pattern.
|
||||
--
|
||||
|
||||
function path.wildcards(pattern)
|
||||
-- Escape characters that have special meanings in Lua patterns
|
||||
pattern = pattern:gsub("([%+%.%-%^%$%(%)%%])", "%%%1")
|
||||
|
||||
-- Replace wildcard patterns with special placeholders so I don't
|
||||
-- have competing star replacements to worry about
|
||||
pattern = pattern:gsub("%*%*", "\001")
|
||||
pattern = pattern:gsub("%*", "\002")
|
||||
|
||||
-- Replace the placeholders with their Lua patterns
|
||||
pattern = pattern:gsub("\001", ".*")
|
||||
pattern = pattern:gsub("\002", "[^/]*")
|
||||
|
||||
return pattern
|
||||
end
|
||||
|
81
src/host/path_wildcards.c
Normal file
81
src/host/path_wildcards.c
Normal file
@ -0,0 +1,81 @@
|
||||
/**
|
||||
* \file path_wildcards.c
|
||||
* \brief Converts from a simple wildcard syntax to the corresponding Lua pattern.
|
||||
* \author Copyright (c) 2015 Tom van Dijck, Jason Perkins and the Premake project
|
||||
*/
|
||||
|
||||
#include "premake.h"
|
||||
#include <string.h>
|
||||
#include <malloc.h>
|
||||
|
||||
/*
|
||||
--Converts from a simple wildcard syntax, where * is "match any"
|
||||
-- and ** is "match recursive", to the corresponding Lua pattern.
|
||||
--
|
||||
-- @param pattern
|
||||
-- The wildcard pattern to convert.
|
||||
-- @returns
|
||||
-- The corresponding Lua pattern.
|
||||
*/
|
||||
int path_wildcards(lua_State* L)
|
||||
{
|
||||
size_t length, i;
|
||||
const char* input;
|
||||
char buffer[0x4000];
|
||||
char* output;
|
||||
|
||||
input = luaL_checklstring(L, 1, &length);
|
||||
output = buffer;
|
||||
|
||||
for (i = 0; i < length; ++i)
|
||||
{
|
||||
char c = input[i];
|
||||
switch (c)
|
||||
{
|
||||
case '+':
|
||||
case '.':
|
||||
case '-':
|
||||
case '^':
|
||||
case '$':
|
||||
case '(':
|
||||
case ')':
|
||||
case '%':
|
||||
*(output++) = '%';
|
||||
*(output++) = c;
|
||||
break;
|
||||
|
||||
case '*':
|
||||
if ((i + 1) < length && input[i + 1] == '*')
|
||||
{
|
||||
i++; // skip the next character.
|
||||
*(output++) = '.';
|
||||
*(output++) = '*';
|
||||
}
|
||||
else
|
||||
{
|
||||
*(output++) = '[';
|
||||
*(output++) = '^';
|
||||
*(output++) = '/';
|
||||
*(output++) = ']';
|
||||
*(output++) = '*';
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
*(output++) = c;
|
||||
break;
|
||||
}
|
||||
|
||||
if (output >= buffer + sizeof(buffer))
|
||||
{
|
||||
lua_pushstring(L, "Wildcards expansion too big.");
|
||||
lua_error(L);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
*(output++) = '\0';
|
||||
|
||||
lua_pushstring(L, buffer);
|
||||
return 1;
|
||||
}
|
@ -49,6 +49,7 @@ static const luaL_Reg path_functions[] = {
|
||||
{ "join", path_join },
|
||||
{ "normalize", path_normalize },
|
||||
{ "translate", path_translate },
|
||||
{ "wildcards", path_wildcards },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
@ -95,6 +95,7 @@ int path_isabsolute(lua_State* L);
|
||||
int path_join(lua_State* L);
|
||||
int path_normalize(lua_State* L);
|
||||
int path_translate(lua_State* L);
|
||||
int path_wildcards(lua_State* L);
|
||||
int os_chdir(lua_State* L);
|
||||
int os_chmod(lua_State* L);
|
||||
int os_copyfile(lua_State* L);
|
||||
|
Reference in New Issue
Block a user