qsort() the elines by id
authoryu.dongliang <18588496441@163.com>
Thu, 3 Jul 2025 08:44:23 +0000 (16:44 +0800)
committeryu.dongliang <18588496441@163.com>
Thu, 3 Jul 2025 08:44:23 +0000 (16:44 +0800)
ses_ui.c

index 27cc42673ef5ee47ab9b182f5f5c108a53246b8d..c2f1d090e11bca654d5262181028cda271478a7a 100644 (file)
--- a/ses_ui.c
+++ b/ses_ui.c
@@ -1,5 +1,17 @@
 #include"ses_ui.h"
 
+static int eline_id_cmp(const void* v0, const void* v1)
+{
+       const ScfEline* el0 = *(const ScfEline**)v0;
+       const ScfEline* el1 = *(const ScfEline**)v1;
+
+       assert(el0->id != el1->id);
+
+       if (el0->id < el1->id)
+               return -1;
+       return 1;
+}
+
 static void ui_add_line(ses_ui_t* ui, ScfEline* el, ScfLine* l)
 {
        ScfEcomponent* c;
@@ -214,6 +226,8 @@ static gboolean draw(GtkWidget *widget, cairo_t *cr, gpointer user_data)
        gtk_render_background(context, cr, 0, 0, width, height);
 
        cairo_set_source_rgba(cr, 1.0, 0.0, 0.0, 1.0);
+       cairo_set_line_width (cr, 2.0);
+
        draw_VA(ui->V_wave, cr);
 
        cairo_set_source_rgba(cr, 0.0, 0.0, 1.0, 1.0);
@@ -627,13 +641,21 @@ static int button_add_eline(ses_ui_t* ui, ScfEline** pel, ScfLine** pl, int x0,
                return ret;
        }
 
+       long i;
+       for (i = 0; i < ui->f->n_elines; i++) {
+               if (i < ui->f->elines[i]->id)
+                       break;
+       }
+
+       el->id = i;
+
        ret = scf_efunction__add_eline(ui->f, el);
        if (ret < 0) {
                ScfEline_free(el);
                return ret;
        }
 
-       el->id = ui->f->n_elines - 1;
+       qsort(ui->f->elines, ui->f->n_elines, sizeof(ScfEline*), eline_id_cmp);
 
        *pel = el;
        *pl  = l;
@@ -1150,6 +1172,28 @@ static int ui_save_file(ses_ui_t* ui)
        if (!ui->f || !ui->save_path)
                return -EINVAL;
 
+       ScfEcomponent*  c;
+       ScfEline*       el;
+       ScfEpin*        p;
+
+       long i;
+       long j;
+
+       for (i = 0; i < ui->f->n_elines; i++) {
+               el =        ui->f->elines[i];
+
+               el->id = i;
+
+               for (j = 0; j + 1 < el->n_pins; j += 2) {
+
+                       c  = ui->f->components[el->pins[j]];
+                       p  = c->pins          [el->pins[j + 1]];
+
+                       p->lid   = el->id;
+                       p->c_lid = el->id;
+               }
+       }
+
        ScfEboard* b = scf_eboard__alloc();
        if (!b)
                return -ENOMEM;
@@ -1753,6 +1797,8 @@ static void undo_clicked(GtkButton* self, gpointer user_data)
                        case UI_DEL_ELINE:
                                scf_efunction__add_eline(ui->f, log->el);
 
+                               qsort(ui->f->elines, ui->f->n_elines, sizeof(ScfEline*), eline_id_cmp);
+
                                ui_add_eline(ui, log->el);
                                break;
 
@@ -1824,6 +1870,8 @@ static void redo_clicked(GtkButton* self, gpointer user_data)
                        case UI_ADD_ELINE:
                                scf_efunction__add_eline(ui->f, log->el);
 
+                               qsort(ui->f->elines, ui->f->n_elines, sizeof(ScfEline*), eline_id_cmp);
+
                                ui_add_eline(ui, log->el);
                                break;
 
@@ -1957,7 +2005,7 @@ static int add_wave_data(scf_vector_t** pvec, char* buf)
 
        if (va->size <= 0) {
                free(va);
-               va = NULL;
+               return 0;
        }
 
        int ret = scf_vector_add(vec, va);
@@ -1973,21 +2021,7 @@ static int add_wave_data(scf_vector_t** pvec, char* buf)
                free(va);
                va = NULL;
        }
-#if 0
-       int i;
-       int j;
-
-       for (i = 0; i < vec->size; i++) {
-               va =        vec->data[i];
 
-               fprintf(stderr, "i: %d, ", i);
-
-               for (j = 0; j < va->size; j++) {
-                       fprintf(stderr, "%lg ", va->data[j]);
-               }
-               fprintf(stderr, "\n");
-       }
-#endif
        return 0;
 }