Skip to content

Commit 19542c3

Browse files
committed
Add lua_regexp, lua_find, lua_gsub to sq_sqlite3, update lua-regex
1 parent 5950990 commit 19542c3

File tree

5 files changed

+113
-45
lines changed

5 files changed

+113
-45
lines changed

SquiLu-editor/editor.cbp

+4
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,9 @@
128128
<Compiler>
129129
<Add option="-Wall" />
130130
<Add option="-fexceptions" />
131+
<Add option="-DSQ_USE_MKSTEMP=1" />
132+
<Add option="-DSQ_USE_LOCALTIME_R=1" />
133+
<Add option="-DONLY_ASCII=1" />
131134
<Add option="-DWITH_DAD_EXTRAS=1" />
132135
<Add option="-DWITH_FLTK=1" />
133136
<Add option="-DWITH_MYSQL=1" />
@@ -172,6 +175,7 @@
172175
<Add directory="../discount" />
173176
<Add directory="../SquiLu-editor" />
174177
<Add directory=".." />
178+
<Add directory="../../../local/postgresql-9.5/include" />
175179
</Compiler>
176180
<Linker>
177181
<Add library="fltk_images" />

SquiLu-ext/sq_sqlite3.cpp

+59-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
/* Code generated by script */
22

33
#include "sq_sqlite3.h"
4+
#include <assert.h>
5+
#include <stdlib.h>
6+
#include "lua-regex.h"
47

58
SQ_OPT_STRING_STRLEN();
69

@@ -1418,6 +1421,61 @@ static SQRESULT sqlite3_exec_fmt(HSQUIRRELVM v, e_type_result type_result, int n
14181421
return 1;
14191422
}
14201423

1424+
//lua_regex
1425+
static void sqlite3_lua_find_base( sqlite3_context *context, int argc, sqlite3_value **argv, int isFind ) {
1426+
assert(argc == 2);
1427+
LuaMatchState ms;
1428+
const char *pattern = (const char *)sqlite3_value_text(argv[0]);
1429+
const char *subject = (const char *)sqlite3_value_text(argv[1]);
1430+
assert(argc == 2);
1431+
ptrdiff_t idx = lua_str_find(&ms, subject, strlen(subject), pattern, strlen(pattern), 0, 0, NULL, NULL);
1432+
if(idx >= 0)
1433+
sqlite3_result_int(context, isFind ? idx : 1);
1434+
else
1435+
{
1436+
if(ms.error) sqlite3_result_error(context, ms.error, strlen(ms.error));
1437+
else sqlite3_result_int(context, isFind ? idx : 0);
1438+
}
1439+
}
1440+
1441+
static void sqlite3_lua_find( sqlite3_context *context, int argc, sqlite3_value **argv ) {
1442+
sqlite3_lua_find_base(context, argc, argv, 1);
1443+
}
1444+
1445+
static void sqlite3_lua_regexp( sqlite3_context *context, int argc, sqlite3_value **argv ) {
1446+
sqlite3_lua_find_base(context, argc, argv, 0);
1447+
}
1448+
1449+
static void sqlite3_lua_gsub( sqlite3_context *context, int argc, sqlite3_value **argv ) {
1450+
assert(argc == 4);
1451+
lua_char_buffer_st *result;
1452+
const char *error_ptr;
1453+
const char *subject = (const char *)sqlite3_value_text(argv[0]);
1454+
const char *pattern = (const char *)sqlite3_value_text(argv[1]);
1455+
const char *replacement = (const char *)sqlite3_value_text(argv[2]);
1456+
int ntimes = sqlite3_value_int(argv[3]);
1457+
if(ntimes < 0) ntimes = 0;
1458+
1459+
if(!subject || !pattern || !replacement){
1460+
sqlite3_result_null(context);
1461+
return;
1462+
}
1463+
result = lua_str_gsub(subject, strlen(subject), pattern, strlen(pattern),
1464+
replacement, strlen(replacement), ntimes, &error_ptr, NULL, NULL);
1465+
if(result){
1466+
sqlite3_result_text(context, result->buf, result->used, SQLITE_TRANSIENT);
1467+
free(result);
1468+
}
1469+
else sqlite3_result_error(context, error_ptr, strlen(error_ptr));
1470+
}
1471+
1472+
int set_sqlite3_lua_regex_func(sqlite3 *db)
1473+
{
1474+
int nErr = sqlite3_create_function(db, "lua_find", 2, SQLITE_UTF8, 0, sqlite3_lua_find, 0, 0);
1475+
nErr += sqlite3_create_function(db, "lua_gsub", 4, SQLITE_UTF8, 0, sqlite3_lua_gsub, 0, 0);
1476+
nErr += sqlite3_create_function(db, "lua_regexp", 2, SQLITE_UTF8, 0, sqlite3_lua_regexp, 0, 0);
1477+
return nErr ? SQLITE_ERROR : SQLITE_OK;
1478+
}
14211479

14221480
static SQRESULT sq_sqlite3_close_release(HSQUIRRELVM v, sq_sqlite3_sdb *sdb)
14231481
{
@@ -1502,6 +1560,7 @@ static SQRESULT sq_sqlite3_constructor(HSQUIRRELVM v)
15021560
int rc = sqlite3_open_v2(dbname, &db, flags, 0);
15031561
if(rc != SQLITE_OK) return sq_throwerror(v, "Failed to open database ! %d", rc);
15041562

1563+
set_sqlite3_lua_regex_func(db);
15051564
sq_sqlite3_sdb *sdb = (sq_sqlite3_sdb *)sq_malloc(sizeof(sq_sqlite3_sdb));
15061565
memset(sdb, 0, sizeof(sq_sqlite3_sdb));
15071566
sdb->db = db;
@@ -2749,7 +2808,6 @@ static SQRESULT sq_sqlite3_restore(HSQUIRRELVM v)
27492808
return rc;
27502809
}
27512810

2752-
27532811
#define _DECL_FUNC(name,nparams,tycheck) {_SC(#name), sq_sqlite3_##name,nparams,tycheck}
27542812
static SQRegFunction sq_sqlite3_methods[] =
27552813
{

SquiLu/squirrel/lua-regex.c

+28-22
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ Adapted by Domingo Alvarez Duarte 2012
2525
http://code.google.com/p/lua-regex-standalone/
2626
*/
2727

28+
#include <assert.h>
2829
#include <stdio.h>
2930
#include <string.h>
3031
#include <stdlib.h>
@@ -48,7 +49,6 @@ static ptrdiff_t posrelat (ptrdiff_t pos, size_t len) {
4849
return (pos >= 0) ? pos : 0;
4950
}
5051

51-
5252
static int check_capture (LuaMatchState *ms, int *l_out) {
5353
int l;
5454
*l_out -= '1';
@@ -366,13 +366,15 @@ static int nospecials (const char *p, size_t l) {
366366
}
367367

368368

369-
static int str_find_aux (LuaMatchState *ms, int find, const char *s, int ls,
370-
const char *p, int lp, int init, int raw_find,
369+
static ptrdiff_t str_find_aux (LuaMatchState *ms, int find, const char *s, ptrdiff_t ls,
370+
const char *p, ptrdiff_t lp, ptrdiff_t init, int raw_find,
371371
luaregex_func_param fp, void *udata) {
372-
int result;
372+
ptrdiff_t result;
373373
ms->error = NULL;
374374
if(ls < 0) ls = strlen(s);
375+
assert(ls >= 0);
375376
if(lp < 0) lp = strlen(p);
377+
assert(lp >= 0);
376378
init = posrelat(init, ls);
377379
if (init < 0) init = 0;
378380
else if (init > ls + 1) { /* start after string's end? */
@@ -430,27 +432,27 @@ static int str_find_aux (LuaMatchState *ms, int find, const char *s, int ls,
430432
}
431433

432434

433-
int str_find (LuaMatchState *ms, const char *s, int ls,
434-
const char *p, int lp, int init, int raw_find,
435+
ptrdiff_t lua_str_find (LuaMatchState *ms, const char *s, ptrdiff_t ls,
436+
const char *p, ptrdiff_t lp, ptrdiff_t init, int raw_find,
435437
luaregex_func_param fp, void *udata) {
436438
return str_find_aux(ms, 1, s, ls, p, lp, init, raw_find, fp, udata);
437439
}
438440

439441

440-
int str_match (LuaMatchState *ms, const char *s, int ls,
441-
const char *p, int lp, int init, int raw_find,
442+
ptrdiff_t lua_str_match (LuaMatchState *ms, const char *s, ptrdiff_t ls,
443+
const char *p, ptrdiff_t lp, ptrdiff_t init, int raw_find,
442444
luaregex_func_param fp, void *udata) {
443445
return str_find_aux(ms, 0, s, ls, p, lp, init, raw_find, fp, udata);
444446
}
445447

448+
#define MIN_ALLOC_SIZE 2048
449+
#define NEW_SIZE(sz) (((sz/MIN_ALLOC_SIZE)+1)*MIN_ALLOC_SIZE)
446450

447-
#define NEW_SIZE(sz) (((sz/1024)+1)*1024)
448-
449-
int char_buffer_add_char(LuaMatchState *ms, char_buffer_st **b, char c){
450-
char_buffer_st *tmp = *b;
451+
int char_buffer_add_char(LuaMatchState *ms, lua_char_buffer_st **b, char c){
452+
lua_char_buffer_st *tmp = *b;
451453
if(tmp->used+1 >= tmp->size){
452-
int new_size = tmp->size+2048;
453-
tmp = (char_buffer_st*)realloc(tmp, sizeof(char_buffer_st) + new_size);
454+
int new_size = tmp->size+MIN_ALLOC_SIZE;
455+
tmp = (lua_char_buffer_st*)realloc(tmp, sizeof(lua_char_buffer_st) + new_size);
454456
if(!tmp){
455457
ms->error = "not enough memory when reallocating";
456458
return 0;
@@ -463,12 +465,13 @@ int char_buffer_add_char(LuaMatchState *ms, char_buffer_st **b, char c){
463465
}
464466

465467

466-
int char_buffer_add_str(LuaMatchState *ms, char_buffer_st **b, const char *str, int len){
467-
char_buffer_st *tmp = *b;
468+
int char_buffer_add_str(LuaMatchState *ms, lua_char_buffer_st **b, const char *str, ptrdiff_t len){
469+
lua_char_buffer_st *tmp = *b;
468470
if(len < 0) len = strlen(str);
471+
assert(len >= 0);
469472
if(tmp->used+len >= tmp->size){
470473
size_t new_size = tmp->size + NEW_SIZE(len);
471-
tmp = (char_buffer_st*)realloc(tmp, sizeof(char_buffer_st) + new_size);
474+
tmp = (lua_char_buffer_st*)realloc(tmp, sizeof(lua_char_buffer_st) + new_size);
472475
if(!tmp){
473476
ms->error = "not enough memory when reallocating";
474477
return 0;
@@ -482,7 +485,7 @@ int char_buffer_add_str(LuaMatchState *ms, char_buffer_st **b, const char *str,
482485
}
483486

484487

485-
static int add_value (LuaMatchState *ms, char_buffer_st **b, const char *s,
488+
static int add_value (LuaMatchState *ms, lua_char_buffer_st **b, const char *s,
486489
const char *e, const char *news, size_t lnews) {
487490
size_t i;
488491
for (i = 0; i < lnews; i++) {
@@ -532,20 +535,23 @@ static int add_value (LuaMatchState *ms, char_buffer_st **b, const char *s,
532535
return 1;
533536
}
534537

535-
char_buffer_st *str_gsub (const char *src, int srcl, const char *p, int lp,
536-
const char *tr, int ltr, size_t max_s, const char **error_ptr,
538+
lua_char_buffer_st *lua_str_gsub (const char *src, ptrdiff_t srcl, const char *p, ptrdiff_t lp,
539+
const char *tr, ptrdiff_t ltr, size_t max_s, const char **error_ptr,
537540
luaregex_func_param fp, void *udata) {
538541
int anchor;
539542
size_t n;
540543
LuaMatchState ms;
541-
char_buffer_st *b;
544+
lua_char_buffer_st *b;
542545
if(srcl < 0) srcl = strlen(src);
546+
assert(srcl >= 0);
543547
if(lp < 0) lp = strlen(p);
548+
assert(lp >= 0);
544549
if(ltr < 0) ltr = strlen(tr);
550+
assert(ltr >= 0);
545551
if(max_s == 0) max_s = srcl+1;
546552
anchor = (*p == '^');
547553
n = NEW_SIZE(srcl);
548-
b = (char_buffer_st*)malloc(sizeof(char_buffer_st) + n);
554+
b = (lua_char_buffer_st*)malloc(sizeof(lua_char_buffer_st) + n);
549555
if(!b) return NULL;
550556
b->size = n;
551557
b->used = 0;

SquiLu/squirrel/lua-regex.h

+11-11
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,10 @@ extern "C" {
4444
#define CAP_UNFINISHED (-1)
4545
#define CAP_POSITION (-2)
4646

47-
typedef struct char_buffer_st {
47+
typedef struct lua_char_buffer_st {
4848
size_t size, used;
4949
char buf[1];
50-
} char_buffer_st;
50+
} lua_char_buffer_st;
5151

5252
typedef struct LuaCapture {
5353
const char *init;
@@ -65,22 +65,22 @@ typedef struct LuaMatchState {
6565
LuaCapture capture[LUA_REGEX_MAXCAPTURES];
6666
} LuaMatchState;
6767

68-
typedef int (*luaregex_func_param)(LuaMatchState *ms, void *udata, char_buffer_st **b);
68+
typedef int (*luaregex_func_param)(LuaMatchState *ms, void *udata, lua_char_buffer_st **b);
6969

70-
int str_find (LuaMatchState *ms, const char *s, int ls,
71-
const char *p, int lp, int init, int raw_find,
70+
ptrdiff_t lua_str_find (LuaMatchState *ms, const char *s, ptrdiff_t ls,
71+
const char *p, ptrdiff_t lp, ptrdiff_t init, int raw_find,
7272
luaregex_func_param fp, void *udata);
7373

74-
int str_match (LuaMatchState *ms, const char *s, int ls,
75-
const char *p, int lp, int init, int raw_find,
74+
ptrdiff_t lua_str_match (LuaMatchState *ms, const char *s, ptrdiff_t ls,
75+
const char *p, ptrdiff_t lp, ptrdiff_t init, int raw_find,
7676
luaregex_func_param fp, void *udata);
7777

78-
char_buffer_st *str_gsub (const char *src, int srcl, const char *p, int lp,
79-
const char *tr, int ltr, size_t max_s, const char **error_ptr,
78+
lua_char_buffer_st *lua_str_gsub (const char *src, ptrdiff_t srcl, const char *p, ptrdiff_t lp,
79+
const char *tr, ptrdiff_t ltr, size_t max_s, const char **error_ptr,
8080
luaregex_func_param fp, void *udata);
8181

82-
int char_buffer_add_char(LuaMatchState *ms, char_buffer_st **b, char c);
83-
int char_buffer_add_str(LuaMatchState *ms, char_buffer_st **b, const char *str, int len);
82+
int char_buffer_add_char(LuaMatchState *ms, lua_char_buffer_st **b, char c);
83+
int char_buffer_add_str(LuaMatchState *ms, lua_char_buffer_st **b, const char *str, ptrdiff_t len);
8484

8585
#ifdef __cplusplus
8686
}

SquiLu/squirrel/sqbaselib.cpp

+11-11
Original file line numberDiff line numberDiff line change
@@ -1318,7 +1318,7 @@ STRING_TOFUNCZ(toupper)
13181318
#include "lua-regex.h"
13191319

13201320
//on 64 bits there is an error SQRESULT/int
1321-
static int process_string_gsub(LuaMatchState *ms, void *udata, char_buffer_st **b) {
1321+
static int process_string_gsub(LuaMatchState *ms, void *udata, lua_char_buffer_st **b) {
13221322
const SQChar *str;
13231323
SQInteger str_size;
13241324
HSQUIRRELVM v = (HSQUIRRELVM)udata;
@@ -1387,7 +1387,7 @@ static SQRESULT string_gsub(HSQUIRRELVM v)
13871387
SQObjectType rtype = sq_gettype(v, 3);
13881388
if(rtype == OT_STRING){
13891389
SQ_GET_STRING(v, 3, replacement);
1390-
char_buffer_st *buf = str_gsub (src, src_size, pattern, pattern_size,
1390+
lua_char_buffer_st *buf = lua_str_gsub (src, src_size, pattern, pattern_size,
13911391
replacement, replacement_size, max_sub, &error_ptr, 0, 0);
13921392
if(buf){
13931393
sq_pushstring(v, buf->buf, buf->used);
@@ -1402,7 +1402,7 @@ static SQRESULT string_gsub(HSQUIRRELVM v)
14021402
case OT_CLOSURE:
14031403
case OT_ARRAY:
14041404
case OT_TABLE:{
1405-
char_buffer_st *buf = str_gsub (src, src_size, pattern, pattern_size,
1405+
lua_char_buffer_st *buf = lua_str_gsub (src, src_size, pattern, pattern_size,
14061406
0, 0, max_sub, &error_ptr, process_string_gsub, v);
14071407
if(buf){
14081408
sq_pushstring(v, buf->buf, buf->used);
@@ -1416,7 +1416,7 @@ static SQRESULT string_gsub(HSQUIRRELVM v)
14161416
return sq_throwerror(v,_SC("invalid type for parameter 3 function/table/array/string expected"));
14171417
}
14181418

1419-
static SQRESULT process_string_gmatch_find(LuaMatchState *ms, void *udata, char_buffer_st **b, bool isFind) {
1419+
static SQRESULT process_string_gmatch_find(LuaMatchState *ms, void *udata, lua_char_buffer_st **b, bool isFind) {
14201420
HSQUIRRELVM v = (HSQUIRRELVM)udata;
14211421
SQInteger top = sq_gettop(v);
14221422
SQInteger result = 1;
@@ -1454,7 +1454,7 @@ static SQRESULT process_string_gmatch_find(LuaMatchState *ms, void *udata, char_
14541454
}
14551455

14561456
//on 64 bits there is an error SQRESULT/int
1457-
static int process_string_gmatch(LuaMatchState *ms, void *udata, char_buffer_st **b) {
1457+
static int process_string_gmatch(LuaMatchState *ms, void *udata, lua_char_buffer_st **b) {
14581458
return process_string_gmatch_find(ms, udata, b, false);
14591459
}
14601460

@@ -1469,15 +1469,15 @@ static SQRESULT string_gmatch(HSQUIRRELVM v)
14691469
if(_top_ > 2){
14701470
SQInteger rtype = sq_gettype(v, 3);
14711471
if(rtype == OT_CLOSURE){
1472-
_rc_ = str_match(&ms, src, src_size, pattern, pattern_size,
1472+
_rc_ = lua_str_match(&ms, src, src_size, pattern, pattern_size,
14731473
0, 0, process_string_gmatch, v);
14741474
if(ms.error) return sq_throwerror(v, ms.error);
14751475
sq_pushinteger(v, _rc_);
14761476
return 1;
14771477
}
14781478
return sq_throwerror(v,_SC("invalid type for parameter 3 function expected"));
14791479
}
1480-
_rc_ = str_match(&ms, src, src_size, pattern, pattern_size, 0, 0, 0, 0);
1480+
_rc_ = lua_str_match(&ms, src, src_size, pattern, pattern_size, 0, 0, 0, 0);
14811481
if(ms.error) return sq_throwerror(v, ms.error);
14821482
if(_rc_ < 0) sq_pushnull(v);
14831483
else if(ms.level){
@@ -1496,7 +1496,7 @@ static SQRESULT string_gmatch(HSQUIRRELVM v)
14961496
return 1;
14971497
}
14981498

1499-
static int process_string_find_lua(LuaMatchState *ms, void *udata, char_buffer_st **b) {
1499+
static int process_string_find_lua(LuaMatchState *ms, void *udata, lua_char_buffer_st **b) {
15001500
return process_string_gmatch_find(ms, udata, b, true);
15011501
}
15021502

@@ -1513,7 +1513,7 @@ static SQRESULT string_find_lua(HSQUIRRELVM v)
15131513
//only want to know if it exists
15141514
LuaMatchState ms;
15151515
memset(&ms, 0, sizeof(ms));
1516-
int rc = str_find(&ms, src, src_size, pattern, pattern_size,
1516+
int rc = lua_str_find(&ms, src, src_size, pattern, pattern_size,
15171517
start, raw == SQTrue, 0, 0);
15181518
if(ms.error) return sq_throwerror(v, ms.error);
15191519
sq_pushinteger(v, rc);
@@ -1522,7 +1522,7 @@ static SQRESULT string_find_lua(HSQUIRRELVM v)
15221522
if(rtype == OT_CLOSURE){
15231523
LuaMatchState ms;
15241524
memset(&ms, 0, sizeof(ms));
1525-
int rc = str_find(&ms, src, src_size, pattern, pattern_size,
1525+
int rc = lua_str_find(&ms, src, src_size, pattern, pattern_size,
15261526
start, raw == SQTrue, process_string_find_lua, v);
15271527
if(ms.error) return sq_throwerror(v, ms.error);
15281528
sq_pushinteger(v, rc);
@@ -1531,7 +1531,7 @@ static SQRESULT string_find_lua(HSQUIRRELVM v)
15311531
else if(rtype == OT_TABLE || rtype == OT_ARRAY){
15321532
LuaMatchState ms;
15331533
memset(&ms, 0, sizeof(ms));
1534-
int rc = str_find(&ms, src, src_size, pattern, pattern_size,
1534+
int rc = lua_str_find(&ms, src, src_size, pattern, pattern_size,
15351535
start, raw == SQTrue, 0, 0);
15361536
if(ms.error) return sq_throwerror(v, ms.error);
15371537
if(rtype == OT_TABLE){

0 commit comments

Comments
 (0)