[INTERPRETER]
* OPT: Optimization in Replace() when the replace string is longer than the search string. String[].Join() becomes faster too. git-svn-id: svn://localhost/gambas/trunk@1683 867c0c6c-44f3-4631-809d-bfa615b0a4ec
This commit is contained in:
parent
155dab4b86
commit
db6b81aa59
4 changed files with 66 additions and 79 deletions
1
TODO
1
TODO
|
@ -57,6 +57,7 @@ DEVELOPMENT ENVIRONMENT
|
||||||
- Generates an index control->component to suggest components for missing controls.
|
- Generates an index control->component to suggest components for missing controls.
|
||||||
- Be able to open a .tar.gz project, and compress it back when the project is closed.
|
- Be able to open a .tar.gz project, and compress it back when the project is closed.
|
||||||
- Ability to merge projects.
|
- Ability to merge projects.
|
||||||
|
- A checkbox in the property sheet to make controls public individually
|
||||||
|
|
||||||
GUI RELATED STUFF
|
GUI RELATED STUFF
|
||||||
|
|
||||||
|
|
|
@ -608,41 +608,15 @@ void SUBR_replace(void)
|
||||||
if (NPARAM == 4)
|
if (NPARAM == 4)
|
||||||
nocase = SUBR_get_integer(&PARAM[3]) == GB_COMP_TEXT;
|
nocase = SUBR_get_integer(&PARAM[3]) == GB_COMP_TEXT;
|
||||||
|
|
||||||
SUBST_init();
|
if (lp >= lr)
|
||||||
|
SUBST_init_max(ls);
|
||||||
|
else
|
||||||
|
SUBST_init_ext(ls, (lr - lp) * 16);
|
||||||
|
|
||||||
if (ls > 0 && lp > 0)
|
if (ls > 0 && lp > 0)
|
||||||
{
|
{
|
||||||
is = 0;
|
is = 0;
|
||||||
|
|
||||||
if (lp >= lr)
|
|
||||||
SUBST_init_max(ls);
|
|
||||||
|
|
||||||
/* if (lp == lr)
|
|
||||||
{
|
|
||||||
STRING_new(&SUBST_buffer, ps, ls);
|
|
||||||
ps = SUBST_buffer;
|
|
||||||
|
|
||||||
for(;;)
|
|
||||||
{
|
|
||||||
pos = STRING_search(ps, ls, pp, lp, 1, FALSE, nocase);
|
|
||||||
if (pos == 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
pos--;
|
|
||||||
|
|
||||||
memcpy(&ps[pos], pr, lr);
|
|
||||||
|
|
||||||
pos += lp;
|
|
||||||
|
|
||||||
ps += pos;
|
|
||||||
ls -= pos;
|
|
||||||
|
|
||||||
if (ls <= 0)
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else*/
|
|
||||||
{
|
|
||||||
for(;;)
|
for(;;)
|
||||||
{
|
{
|
||||||
pos = STRING_search(ps, ls, pp, lp, 1, FALSE, nocase);
|
pos = STRING_search(ps, ls, pp, lp, 1, FALSE, nocase);
|
||||||
|
@ -667,7 +641,6 @@ void SUBR_replace(void)
|
||||||
|
|
||||||
SUBST_add(ps, ls);
|
SUBST_add(ps, ls);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
SUBST_exit();
|
SUBST_exit();
|
||||||
|
|
||||||
|
|
|
@ -36,8 +36,10 @@ char *SUBST_buffer = NULL;
|
||||||
char SUBST_temp[SUBST_TEMP_SIZE];
|
char SUBST_temp[SUBST_TEMP_SIZE];
|
||||||
int SUBST_ntemp;
|
int SUBST_ntemp;
|
||||||
|
|
||||||
static bool _prealloc;
|
static int _inc = 0;
|
||||||
static char *_prealloc_ptr;
|
static int _len = 0;
|
||||||
|
static int _max = 0;
|
||||||
|
static char *_ptr;
|
||||||
|
|
||||||
void SUBST_dump_temp(void)
|
void SUBST_dump_temp(void)
|
||||||
{
|
{
|
||||||
|
@ -50,26 +52,26 @@ void SUBST_dump_temp(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SUBST_init(void)
|
void SUBST_init_ext(int len, int inc)
|
||||||
{
|
{
|
||||||
SUBST_buffer = NULL;
|
if (inc == 0)
|
||||||
SUBST_ntemp = 0;
|
inc = 32;
|
||||||
_prealloc = FALSE;
|
if (len == 0)
|
||||||
}
|
len = inc;
|
||||||
|
|
||||||
void SUBST_init_max(int max)
|
STRING_new(&SUBST_buffer, NULL, len);
|
||||||
{
|
_inc = inc;
|
||||||
|
_max = len;
|
||||||
|
_len = 0;
|
||||||
|
_ptr = SUBST_buffer;
|
||||||
SUBST_ntemp = 0;
|
SUBST_ntemp = 0;
|
||||||
STRING_new(&SUBST_buffer, NULL, max);
|
|
||||||
_prealloc = TRUE;
|
|
||||||
_prealloc_ptr = SUBST_buffer;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// len == 0 est possible ! On peut vouloir ajouter une chaîne vide.
|
// len == 0 est possible ! On peut vouloir ajouter une chaîne vide.
|
||||||
|
|
||||||
void SUBST_add(const char *src, int len)
|
void SUBST_add(const char *src, int len)
|
||||||
{
|
{
|
||||||
int old_len;
|
int pos;
|
||||||
|
|
||||||
if (!src)
|
if (!src)
|
||||||
return;
|
return;
|
||||||
|
@ -82,28 +84,36 @@ void SUBST_add(const char *src, int len)
|
||||||
|
|
||||||
SUBST_dump_temp();
|
SUBST_dump_temp();
|
||||||
|
|
||||||
if (_prealloc)
|
_len += len;
|
||||||
|
|
||||||
|
if (_len >= _max)
|
||||||
{
|
{
|
||||||
memcpy(_prealloc_ptr, src, len);
|
pos = (_len - _max) * 4;
|
||||||
_prealloc_ptr += len;
|
if (pos < _inc)
|
||||||
}
|
pos = _inc;
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
old_len = STRING_length(SUBST_buffer);
|
_inc = (pos + 31) & ~31;
|
||||||
|
if (_inc > 1024)
|
||||||
STRING_extend(&SUBST_buffer, old_len + len);
|
_inc = 1024;
|
||||||
memcpy(&SUBST_buffer[old_len], src, len);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_max += pos;
|
||||||
|
|
||||||
|
//fprintf(stderr, "STRING_extend: %d\n", _max - STRING_length(SUBST_buffer));
|
||||||
|
pos = _ptr - SUBST_buffer;
|
||||||
|
STRING_extend(&SUBST_buffer, _max);
|
||||||
|
_ptr = &SUBST_buffer[pos];
|
||||||
|
}
|
||||||
|
|
||||||
|
memcpy(_ptr, src, len);
|
||||||
|
_ptr += len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void SUBST_exit(void)
|
void SUBST_exit(void)
|
||||||
{
|
{
|
||||||
SUBST_dump_temp();
|
SUBST_dump_temp();
|
||||||
if (_prealloc)
|
STRING_extend(&SUBST_buffer, _len);
|
||||||
{
|
|
||||||
STRING_extend(&SUBST_buffer, _prealloc_ptr - SUBST_buffer);
|
|
||||||
_prealloc = FALSE;
|
|
||||||
}
|
|
||||||
STRING_extend_end(&SUBST_buffer);
|
STRING_extend_end(&SUBST_buffer);
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,8 +39,8 @@ typedef
|
||||||
typedef
|
typedef
|
||||||
void (*SUBST_ADD_FUNC)(int);
|
void (*SUBST_ADD_FUNC)(int);
|
||||||
|
|
||||||
void SUBST_init(void);
|
void SUBST_init(int len, int inc);
|
||||||
void SUBST_init_max(int max);
|
void SUBST_init_ext(int len, int inc);
|
||||||
void SUBST_add(const char *src, int len);
|
void SUBST_add(const char *src, int len);
|
||||||
void SUBST_exit(void);
|
void SUBST_exit(void);
|
||||||
void SUBST_dump_temp(void);
|
void SUBST_dump_temp(void);
|
||||||
|
@ -52,4 +52,7 @@ void SUBST_dump_temp(void);
|
||||||
SUBST_temp[SUBST_ntemp++]= (_c); \
|
SUBST_temp[SUBST_ntemp++]= (_c); \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SUBST_init() SUBST_init_ext(0, 0)
|
||||||
|
#define SUBST_init_max(_max) SUBST_init_ext((_max), 0)
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in a new issue