[hackers] [scc] Return correct node iin initlist() || Roberto E. Vargas Caballero

From: <git_AT_suckless.org>
Date: Mon, 18 Jan 2016 17:51:56 +0100 (CET)

commit 6e980d9048da9c1aaaafa68ee7835ad83423a07a
Author: Roberto E. Vargas Caballero <k0ga_AT_shike2.com>
AuthorDate: Mon Jan 18 14:11:21 2016 +0100
Commit: Roberto E. Vargas Caballero <k0ga_AT_shike2.com>
CommitDate: Mon Jan 18 14:11:21 2016 +0100

    Return correct node iin initlist()
    
    This function must generate a node, because one initializator
    can be the expression used to initialize a field of another
    aggregate.

diff --git a/cc1/cc1.h b/cc1/cc1.h
index 47710b7..b6f1d4e 100644
--- a/cc1/cc1.h
+++ b/cc1/cc1.h
_AT_@ -17,6 +17,7 @@ typedef struct symbol Symbol;
 typedef struct caselist Caselist;
 typedef struct node Node;
 typedef struct input Input;
+typedef struct init Init;
 
 struct limits {
         union {
_AT_@ -61,6 +62,14 @@ struct type {
         } n;
 };
 
+struct designator;
+
+struct init {
+ Type *type;
+ TUINT pos;
+ struct designator *head;
+};
+
 struct symbol {
         char *name;
         Type *type;
_AT_@ -75,6 +84,7 @@ struct symbol {
                 TFLOAT f;
                 char *s;
                 unsigned char token;
+ Init *init;
                 Symbol **pars;
         } u;
         struct symbol *next;
diff --git a/cc1/init.c b/cc1/init.c
index aa601ce..c5895ee 100644
--- a/cc1/init.c
+++ b/cc1/init.c
_AT_@ -6,7 +6,6 @@
 #include "../inc/sizes.h"
 #include "cc1.h"
 
-typedef struct inititlizer Init;
 
 struct designator {
         TINT pos;
_AT_@ -14,11 +13,6 @@ struct designator {
         struct designator *next;
 };
 
-struct inititlizer {
- Type *type;
- TUINT curpos;
- struct designator *head;
-};
 
 static TINT
 arydesig(Init *ip)
_AT_@ -79,7 +73,7 @@ designation(Init *ip)
         default: return ip;
         }
 
- ip->curpos = (*fun)(ip);
+ ip->pos = (*fun)(ip);
         expect('=');
         return ip;
 }
_AT_@ -87,53 +81,53 @@ designation(Init *ip)
 static Node *
 initlist(Symbol *sym, Type *tp)
 {
- struct inititlizer *ip;
+ Init *ip;
+ Symbol *nsym;
         struct designator *dp;
         int toomany = 0;
- TINT n;
         Type *newtp;
 
         ip = xmalloc(sizeof(*ip));
         ip->head = NULL;
+ ip->pos = 0;
+ ip->type = tp;
+
         if (accept('}'))
- return NULL;
+ goto end_of_initializer;
 
- for (ip->curpos = 0; ; ++ip->curpos) {
+ for (ip->pos = 1; ; ++ip->pos) {
                 designation(ip);
                 switch (tp->op) {
                 case ARY:
                         newtp = tp->type;
- if (!tp->defined || n < tp->n.elem)
+ if (!tp->defined || ip->pos < tp->n.elem)
                                 break;
                         if (!toomany)
                                 warn("excess elements in array initializer");
                         toomany = 1;
- sym = NULL;
                         break;
                 case STRUCT:
- if (n < tp->n.elem) {
- sym = tp->p.fields[n];
+ if (ip->pos < tp->n.elem) {
+ sym = tp->p.fields[ip->pos];
                                 newtp = sym->type;
                                 break;
                         }
                         if (!toomany)
                                 warn("excess elements in struct initializer");
                         toomany = 1;
- sym = NULL;
                         break;
                 default:
                         newtp = tp;
                         warn("braces around scalar initializer");
- if (n <= 0)
+ if (ip->pos <= 0)
                                 break;
                         if (!toomany)
                                 warn("excess elements in scalar initializer");
                         toomany = 1;
- sym = NULL;
                         break;
                 }
                 dp = ip->head;
- dp->pos = ip->curpos;
+ dp->pos = ip->pos;
                 /* TODO: pass the correct parameters to initlist */
                 dp->expr = (accept('{')) ? initlist(sym, tp) : assign(NULL);
 
_AT_@ -142,11 +136,14 @@ initlist(Symbol *sym, Type *tp)
         }
         expect('}');
 
+end_of_initializer:
         if (tp->op == ARY && !tp->defined) {
- tp->n.elem = n + 1;
+ tp->n.elem = ip->pos;
                 tp->defined = 1;
         }
- return NULL;
+ nsym = newsym(NS_IDEN);
+ nsym->u.init = ip;
+ return constnode(nsym);
 }
 
 void
Received on Mon Jan 18 2016 - 17:51:56 CET

This archive was generated by hypermail 2.3.0 : Mon Jan 18 2016 - 18:00:20 CET