Changeset 5397


Ignore:
Timestamp:
08/06/09 23:57:18 (4 years ago)
Author:
werner
Message:
  • tables no longer try to fill the available space in the variables area
  • added string-valued expressions (on-going)
  • loops, tables, and rows can now be deleted/undeleted (still need columns)
Location:
trunk/eda/fped
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/eda/fped/delete.c

    r5396 r5397  
    2727                dt_obj, 
    2828                dt_frame, 
     29                dt_table, 
     30                dt_row, 
     31                dt_column, 
     32                dt_loop, 
    2933        } type; 
    3034        union { 
     
    4145                        struct obj *prev; 
    4246                } obj; 
     47                struct { 
     48                        struct table *ref; 
     49                        struct table *prev; 
     50                } table; 
     51                struct { 
     52                        struct row *ref; 
     53                        struct row *prev; 
     54                } row; 
     55                struct { 
     56                        struct var *var; 
     57                        struct value *values; 
     58                        struct table *table; 
     59                        int n; 
     60                } col; 
     61                struct { 
     62                        struct loop *ref; 
     63                        struct loop *prev; 
     64                } loop; 
    4365        } u; 
    4466        int group; 
     
    226248} 
    227249 
     250 
     251 
     252/* ----- rows -------------------------------------------------------------- */ 
     253 
     254 
     255void delete_row(struct row *row) 
     256{ 
     257        struct deletion *del; 
     258        struct row *walk, *prev; 
     259 
     260        groups++; 
     261        prev = NULL; 
     262        for (walk = row->table->rows; walk != row; walk = walk->next) 
     263                prev = walk; 
     264        if (prev) 
     265                prev->next = row->next; 
     266        else 
     267                row->table->rows = row->next; 
     268        del = new_deletion(dt_row); 
     269        del->u.row.ref = row; 
     270        del->u.row.prev = prev; 
     271} 
     272 
     273 
     274static void undelete_row(struct row *row, struct row *prev) 
     275{ 
     276        if (prev) { 
     277                assert(row->next == prev->next); 
     278                prev->next = row; 
     279        } else { 
     280                assert(row->next == row->table->rows); 
     281                row->table->rows = row; 
     282        } 
     283} 
     284 
     285 
     286/* ----- columns ----------------------------------------------------------- */ 
     287 
     288 
     289void delete_column(struct table *table, int n) 
     290{ 
     291        groups++; 
     292} 
     293 
     294 
    228295/* ----- tables ------------------------------------------------------------ */ 
    229296 
    230297 
    231 void delete_row(struct row *row) 
    232 { 
    233 } 
    234  
    235  
    236 void delete_column(struct table *table, int n) 
    237 { 
    238 } 
    239  
    240  
    241298void delete_table(struct table *table) 
    242299{ 
     300        struct frame *frame = table->vars->frame; 
     301        struct deletion *del; 
     302        struct table *walk, *prev; 
     303 
     304        groups++; 
     305        prev = NULL; 
     306        for (walk = frame->tables; walk != table; walk = walk->next) 
     307                prev = walk; 
     308        if (prev) 
     309                prev->next = table->next; 
     310        else 
     311                frame->tables = table->next; 
     312        del = new_deletion(dt_table); 
     313        del->u.table.ref = table; 
     314        del->u.table.prev = prev; 
     315} 
     316 
     317 
     318static void undelete_table(struct table *table, struct table *prev) 
     319{ 
     320        struct frame *frame = table->vars->frame; 
     321 
     322        if (prev) { 
     323                assert(table->next == prev->next); 
     324                prev->next = table; 
     325        } else { 
     326                assert(table->next == frame->tables); 
     327                frame->tables = table; 
     328        } 
    243329} 
    244330 
     
    249335void delete_loop(struct loop *loop) 
    250336{ 
     337        struct frame *frame = loop->var.frame; 
     338        struct deletion *del; 
     339        struct loop *walk, *prev; 
     340 
     341        groups++; 
     342        prev = NULL; 
     343        for (walk = frame->loops; walk != loop; walk = walk->next) 
     344                prev = walk; 
     345        if (prev) 
     346                prev->next = loop->next; 
     347        else 
     348                frame->loops = loop->next; 
     349        del = new_deletion(dt_loop); 
     350        del->u.loop.ref = loop; 
     351        del->u.loop.prev = prev; 
     352} 
     353 
     354 
     355static void undelete_loop(struct loop *loop, struct loop *prev) 
     356{ 
     357        struct frame *frame = loop->var.frame; 
     358 
     359        if (prev) { 
     360                assert(loop->next == prev->next); 
     361                prev->next = loop; 
     362        } else { 
     363                assert(loop->next == frame->loops); 
     364                frame->loops = loop; 
     365        } 
    251366} 
    252367 
     
    348463                undelete_frame(del->u.frame.ref, del->u.frame.prev); 
    349464                break; 
     465        case dt_loop: 
     466                undelete_loop(del->u.loop.ref, del->u.loop.prev); 
     467                break; 
     468        case dt_table: 
     469                undelete_table(del->u.table.ref, del->u.table.prev); 
     470                break; 
     471        case dt_row: 
     472                undelete_row(del->u.row.ref, del->u.row.prev); 
     473                break; 
    350474        default: 
    351475                abort(); 
  • trunk/eda/fped/expr.c

    r5389 r5397  
    100100 
    101101/* ----- primary expressions ----------------------------------------------- */ 
     102 
     103 
     104struct num op_string(const struct expr *self, const struct frame *frame) 
     105{ 
     106        fail("cannot evaluate string"); 
     107        return undef; 
     108} 
    102109 
    103110 
  • trunk/eda/fped/expr.h

    r5389 r5397  
    4444                struct num num; 
    4545                const char *var; 
     46                char *str; 
    4647                struct { 
    4748                        struct expr *a; 
     
    108109struct num op_num(const struct expr *self, const struct frame *frame); 
    109110struct num op_var(const struct expr *self, const struct frame *frame); 
     111struct num op_string(const struct expr *self, const struct frame *frame); 
    110112 
    111113struct num op_minus(const struct expr *self, const struct frame *frame); 
  • trunk/eda/fped/fpd.y

    r5396 r5397  
    531531                        $$->u.var = $1; 
    532532                } 
     533        | STRING 
     534                { 
     535                        $$ = new_op(op_string); 
     536                        $$->u.str = $1; 
     537                } 
    533538        | '(' expr ')' 
    534539                { 
  • trunk/eda/fped/gui.c

    r5396 r5397  
    713713{ 
    714714        GtkWidget *tab, *field; 
    715         GtkWidget *evbox; 
     715        GtkWidget *evbox, *align; 
    716716        struct var *var; 
    717717        struct row *row; 
     
    730730 
    731731        evbox = gtk_event_box_new(); 
    732         gtk_box_pack_start(GTK_BOX(vbox), evbox, FALSE, FALSE, 0); 
     732        align = gtk_alignment_new(0, 0, 0, 0); 
     733        gtk_container_add(GTK_CONTAINER(align), evbox); 
     734        gtk_box_pack_start(GTK_BOX(vbox), align, FALSE, FALSE, 0); 
    733735 
    734736        tab = gtk_table_new(n_rows+1, n_vars, FALSE); 
Note: See TracChangeset for help on using the changeset viewer.