aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--editors/awk.c84
1 files changed, 41 insertions, 43 deletions
diff --git a/editors/awk.c b/editors/awk.c
index d9f9e0f6e..2245cad03 100644
--- a/editors/awk.c
+++ b/editors/awk.c
@@ -987,7 +987,6 @@ static uint32_t next_token(uint32_t expected)
const char *tl;
uint32_t tc;
const uint32_t *ti;
- int l;
if (t_rollback) {
t_rollback = FALSE;
@@ -1053,7 +1052,7 @@ static uint32_t next_token(uint32_t expected)
char *pp = p;
t_double = my_strtod(&pp);
p = pp;
- if (*pp == '.')
+ if (*p == '.')
syntax_error(EMSG_UNEXP_TOKEN);
tc = TC_NUMBER;
@@ -1063,52 +1062,51 @@ static uint32_t next_token(uint32_t expected)
tc = 0x00000001;
ti = tokeninfo;
while (*tl) {
- l = *tl++;
- if (l == NTCC) {
+ int l = (unsigned char) *tl++;
+ if (l == (unsigned char) NTCC) {
tc <<= 1;
continue;
}
- /* if token class is expected, token
- * matches and it's not a longer word,
- * then this is what we are looking for
+ /* if token class is expected,
+ * token matches,
+ * and it's not a longer word,
*/
if ((tc & (expected | TC_WORD | TC_NEWLINE))
- && *tl == *p && strncmp(p, tl, l) == 0
+ && strncmp(p, tl, l) == 0
&& !((tc & TC_WORD) && isalnum_(p[l]))
) {
+ /* then this is what we are looking for */
t_info = *ti;
p += l;
- break;
+ goto token_found;
}
ti++;
tl += l;
}
-
- if (!*tl) {
- /* it's a name (var/array/function),
- * otherwise it's something wrong
- */
- if (!isalnum_(*p))
- syntax_error(EMSG_UNEXP_TOKEN);
-
- t_string = --p;
- while (isalnum_(*++p)) {
- p[-1] = *p;
- }
- p[-1] = '\0';
- tc = TC_VARIABLE;
- /* also consume whitespace between functionname and bracket */
- if (!(expected & TC_VARIABLE) || (expected & TC_ARRAY))
- p = skip_spaces(p);
- if (*p == '(') {
- tc = TC_FUNCTION;
- } else {
- if (*p == '[') {
- p++;
- tc = TC_ARRAY;
- }
+ /* not a known token */
+
+ /* is it a name? (var/array/function) */
+ if (!isalnum_(*p))
+ syntax_error(EMSG_UNEXP_TOKEN); /* no */
+ /* yes */
+ t_string = --p;
+ while (isalnum_(*++p)) {
+ p[-1] = *p;
+ }
+ p[-1] = '\0';
+ tc = TC_VARIABLE;
+ /* also consume whitespace between functionname and bracket */
+ if (!(expected & TC_VARIABLE) || (expected & TC_ARRAY))
+ p = skip_spaces(p);
+ if (*p == '(') {
+ tc = TC_FUNCTION;
+ } else {
+ if (*p == '[') {
+ p++;
+ tc = TC_ARRAY;
}
}
+ token_found: ;
}
g_pos = p;
@@ -1186,6 +1184,7 @@ static node *parse_expr(uint32_t iexp)
xtc = TC_OPERAND | TC_UOPPRE | TC_REGEXP | iexp;
while (!((tc = next_token(xtc)) & iexp)) {
+
if (glptr && (t_info == (OC_COMPARE | VV | P(39) | 2))) {
/* input redirection (<) attached to glptr node */
cn = glptr->l.n = new_node(OC_CONCAT | SS | P(37));
@@ -1522,10 +1521,10 @@ static node *mk_splitter(const char *s, tsplitter *spl)
regfree(re);
regfree(ire); // TODO: nuke ire, use re+1?
}
- if (strlen(s) > 1) {
+ if (s[0] && s[1]) { /* strlen(s) > 1 */
mk_re_node(s, n, re);
} else {
- n->info = (uint32_t) *s;
+ n->info = (uint32_t) s[0];
}
return n;
@@ -1582,24 +1581,22 @@ static void fsrealloc(int size)
if (size >= maxfields) {
i = maxfields;
maxfields = size + 16;
- Fields = xrealloc(Fields, maxfields * sizeof(var));
+ Fields = xrealloc(Fields, maxfields * sizeof(Fields[0]));
for (; i < maxfields; i++) {
Fields[i].type = VF_SPECIAL;
Fields[i].string = NULL;
}
}
-
- if (size < nfields) {
- for (i = size; i < nfields; i++) {
- clrvar(Fields + i);
- }
+ /* if size < nfields, clear extra field variables */
+ for (i = size; i < nfields; i++) {
+ clrvar(Fields + i);
}
nfields = size;
}
static int awk_split(const char *s, node *spl, char **slist)
{
- int l, n = 0;
+ int l, n;
char c[4];
char *s1;
regmatch_t pmatch[2]; // TODO: why [2]? [1] is enough...
@@ -1613,6 +1610,7 @@ static int awk_split(const char *s, node *spl, char **slist)
if (*getvar_s(intvar[RS]) == '\0')
c[2] = '\n';
+ n = 0;
if ((spl->info & OPCLSMASK) == OC_REGEXP) { /* regex split */
if (!*s)
return n; /* "": zero fields */
@@ -1658,7 +1656,7 @@ static int awk_split(const char *s, node *spl, char **slist)
}
if (*s1)
n++;
- while ((s1 = strpbrk(s1, c))) {
+ while ((s1 = strpbrk(s1, c)) != NULL) {
*s1++ = '\0';
n++;
}