diff options
Diffstat (limited to 'editors')
-rw-r--r-- | editors/awk.c | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/editors/awk.c b/editors/awk.c index 3f8368c8f..9b15b3cd6 100644 --- a/editors/awk.c +++ b/editors/awk.c | |||
@@ -604,8 +604,8 @@ static void *hash_find(xhash *hash, const char *name) | |||
604 | hash_rebuild(hash); | 604 | hash_rebuild(hash); |
605 | 605 | ||
606 | l = strlen(name) + 1; | 606 | l = strlen(name) + 1; |
607 | hi = xzalloc(sizeof(hash_item) + l); | 607 | hi = xzalloc(sizeof(*hi) + l); |
608 | memcpy(hi->name, name, l); | 608 | strcpy(hi->name, name); |
609 | 609 | ||
610 | idx = hashidx(name) % hash->csize; | 610 | idx = hashidx(name) % hash->csize; |
611 | hi->next = hash->items[idx]; | 611 | hi->next = hash->items[idx]; |
@@ -1482,6 +1482,7 @@ static node *mk_splitter(const char *s, tsplitter *spl) | |||
1482 | */ | 1482 | */ |
1483 | static regex_t *as_regex(node *op, regex_t *preg) | 1483 | static regex_t *as_regex(node *op, regex_t *preg) |
1484 | { | 1484 | { |
1485 | int cflags; | ||
1485 | var *v; | 1486 | var *v; |
1486 | const char *s; | 1487 | const char *s; |
1487 | 1488 | ||
@@ -1490,7 +1491,17 @@ static regex_t *as_regex(node *op, regex_t *preg) | |||
1490 | } | 1491 | } |
1491 | v = nvalloc(1); | 1492 | v = nvalloc(1); |
1492 | s = getvar_s(evaluate(op, v)); | 1493 | s = getvar_s(evaluate(op, v)); |
1493 | xregcomp(preg, s, icase ? REG_EXTENDED | REG_ICASE : REG_EXTENDED); | 1494 | |
1495 | cflags = icase ? REG_EXTENDED | REG_ICASE : REG_EXTENDED; | ||
1496 | /* Testcase where REG_EXTENDED fails (unpaired '{'): | ||
1497 | * echo Hi | awk 'gsub("@(samp|code|file)\{","");' | ||
1498 | * gawk 3.1.5 eats this. We revert to ~REG_EXTENDED | ||
1499 | * (maybe gsub is not supposed to use REG_EXTENDED?). | ||
1500 | */ | ||
1501 | if (regcomp(preg, s, cflags)) { | ||
1502 | cflags &= ~REG_EXTENDED; | ||
1503 | xregcomp(preg, s, cflags); | ||
1504 | } | ||
1494 | nvfree(v); | 1505 | nvfree(v); |
1495 | return preg; | 1506 | return preg; |
1496 | } | 1507 | } |