Get rid of Paragraph->open
authorThomas White <taw@physics.org>
Mon, 12 Mar 2018 21:35:43 +0000 (22:35 +0100)
committerThomas White <taw@physics.org>
Mon, 12 Mar 2018 21:35:43 +0000 (22:35 +0100)
src/frame.c
src/frame.h
src/sc_editor.c
src/sc_interp.c

index 51e7e66..221952f 100644 (file)
@@ -53,7 +53,6 @@ struct _paragraph
        /* For PARA_TYPE_TEXT */
        int              n_runs;
        struct text_run *runs;
-       int              open;
        PangoLayout     *layout;
 
        /* For anything other than PARA_TYPE_TEXT
@@ -399,11 +398,6 @@ void add_run(Paragraph *para, SCBlock *scblock, SCBlock *rscblock,
 {
        struct text_run *runs_new;
 
-       if ( !para->open ) {
-               fprintf(stderr, "Adding a run to a closed paragraph!\n");
-               //return;
-       }
-
        runs_new = realloc(para->runs,
                           (para->n_runs+1)*sizeof(struct text_run));
        if ( runs_new == NULL ) {
@@ -423,7 +417,7 @@ void add_run(Paragraph *para, SCBlock *scblock, SCBlock *rscblock,
 }
 
 
-static Paragraph *create_paragraph(struct frame *fr)
+Paragraph *create_paragraph(struct frame *fr)
 {
        Paragraph **paras_new;
        Paragraph *pnew;
@@ -437,6 +431,14 @@ static Paragraph *create_paragraph(struct frame *fr)
        fr->paras = paras_new;
        fr->paras[fr->n_paras++] = pnew;
 
+       /* For now, assume the paragraph is going to be for text.
+        * However, this can easily be changed */
+       pnew->type = PARA_TYPE_TEXT;
+       pnew->n_runs = 0;
+       pnew->runs = NULL;
+       pnew->layout = NULL;
+       pnew->height = 0.0;
+
        return pnew;
 }
 
@@ -459,8 +461,6 @@ Paragraph *insert_paragraph(struct frame *fr, int pos)
        pnew = calloc(1, sizeof(struct _paragraph));
        if ( pnew == NULL ) return NULL;
 
-       pnew->open = 1;
-
        fr->paras = paras_new;
        fr->n_paras++;
 
@@ -497,7 +497,6 @@ void add_callback_para(struct frame *fr, SCBlock *bl, SCBlock *rbl,
        pnew->bvp = bvp;
        pnew->vp = vp;
        pnew->height = h;
-       pnew->open = 0;
 }
 
 
@@ -534,7 +533,6 @@ void add_image_para(struct frame *fr, SCBlock *scblock, SCBlock *rscblock,
        pnew->image_real_w = wi;
        pnew->image_real_h = hi;
        pnew->height = h;
-       pnew->open = 0;
        pnew->space[0] = 0.0;
        pnew->space[1] = 0.0;
        pnew->space[2] = 0.0;
@@ -553,62 +551,10 @@ double total_height(struct frame *fr)
 }
 
 
-Paragraph *last_open_para(struct frame *fr)
-{
-       Paragraph *pnew;
-
-       if ( (fr->paras != NULL) && (fr->paras[fr->n_paras-1]->open) ) {
-               return fr->paras[fr->n_paras-1];
-       }
-
-       /* No open paragraph found, create a new one */
-       pnew = create_paragraph(fr);
-       if ( pnew == NULL ) return NULL;
-
-       pnew->type = PARA_TYPE_TEXT;
-       pnew->open = 1;
-       pnew->n_runs = 0;
-       pnew->runs = NULL;
-       pnew->layout = NULL;
-       pnew->height = 0.0;
-
-       return pnew;
-}
-
-
-void add_newpara(struct frame *fr, SCBlock *bl)
+Paragraph *last_para(struct frame *fr)
 {
-       Paragraph *last_para;
-
-       if ( fr->paras == NULL ) return;
-       last_para = fr->paras[fr->n_paras-1];
-
-       if ( last_para->open ) {
-               set_newline_at_end(last_para, bl);
-               close_last_paragraph(fr);
-       } /* else do nothing */
-}
-
-
-void close_last_paragraph(struct frame *fr)
-{
-       if ( fr->paras == NULL ) return;
-       if ( fr->paras[fr->n_paras-1]->type != PARA_TYPE_TEXT ) {
-               printf("Closing a non-text paragraph!\n");
-       }
-       fr->paras[fr->n_paras-1]->open = 0;
-}
-
-
-int last_para_available_for_text(struct frame *fr)
-{
-       Paragraph *last_para;
-       if ( fr->paras == NULL ) return 0;
-       last_para = fr->paras[fr->n_paras-1];
-       if ( last_para->type == PARA_TYPE_TEXT ) {
-               if ( last_para->open ) return 1;
-       }
-       return 0;
+       if ( fr->paras == NULL ) return NULL;
+       return fr->paras[fr->n_paras-1];
 }
 
 
@@ -1671,9 +1617,6 @@ static SCBlock *split_text_paragraph(struct frame *fr, int pn, size_t pos,
                        pnew->n_runs = 0;
                        add_run(pnew, end, end, fr->fontdesc, fr->col);
 
-                       pnew->open = para->open;
-                       para->open = 0;
-
                        wrap_paragraph(pnew, pc, fr->w - fr->pad_l - fr->pad_r, 0, 0);
 
                        return end;
@@ -1744,9 +1687,6 @@ static SCBlock *split_text_paragraph(struct frame *fr, int pn, size_t pos,
        nnp = sc_block_append(rr->rscblock, strdup("newpara"), NULL, NULL, NULL);
        set_newline_at_end(para, nnp);
 
-       pnew->open = para->open;
-       para->open = 0;
-
        wrap_paragraph(para, pc, fr->w - fr->pad_l - fr->pad_r, 0, 0);
        wrap_paragraph(pnew, pc, fr->w - fr->pad_l - fr->pad_r, 0, 0);
 
@@ -1808,18 +1748,6 @@ void set_para_spacing(Paragraph *para, float space[4])
 }
 
 
-Paragraph *current_para(struct frame *fr)
-{
-       if ( fr == NULL ) return NULL;
-
-       if ( (fr->paras != NULL) && (fr->paras[fr->n_paras-1]->open) ) {
-               return fr->paras[fr->n_paras-1];
-       }
-
-       return NULL;
-}
-
-
 void *get_para_bvp(Paragraph *para)
 {
        if ( para->type != PARA_TYPE_CALLBACK ) return NULL;
index af2e9fd..606fabf 100644 (file)
@@ -121,11 +121,7 @@ extern struct frame *find_frame_with_scblocks(struct frame *top,
 
 extern double total_height(struct frame *fr);
 
-extern void add_newpara(struct frame *fr, SCBlock *bl);
-extern Paragraph *last_open_para(struct frame *fr);
-extern Paragraph *current_para(struct frame *fr);
-extern void close_last_paragraph(struct frame *fr);
-extern int last_para_available_for_text(struct frame *fr);
+extern Paragraph *last_para(struct frame *fr);
 extern void show_para(Paragraph *p);
 extern void set_para_spacing(Paragraph *para, float space[4]);
 
@@ -202,6 +198,7 @@ extern int get_sc_pos(struct frame *fr, int pn, size_t pos,
 extern void *get_para_bvp(Paragraph *para);
 
 extern void merge_paragraphs(struct frame *fr, int para);
+extern Paragraph *create_paragraph(struct frame *fr);
 
 extern enum para_type para_type(Paragraph *para);
 extern SCBlock *para_scblock(Paragraph *para);
index 00c626d..0cd810c 100644 (file)
@@ -1061,7 +1061,7 @@ static void check_paragraph(struct frame *fr, PangoContext *pc,
                             SCBlock *scblocks)
 {
        if ( fr->n_paras > 0 ) return;
-       Paragraph *para = last_open_para(fr);
+       Paragraph *para = last_para(fr);
 
        if ( scblocks == NULL ) {
                /* We have no SCBlocks at all!  Better create one... */
index c9f3d76..d827326 100644 (file)
@@ -695,7 +695,7 @@ static void set_paraspace(SCInterpreter *scin, const char *opts)
        st->paraspace[2] = p[2];
        st->paraspace[3] = p[3];
 
-       set_para_spacing(current_para(sc_interp_get_frame(scin)), p);
+       set_para_spacing(last_para(sc_interp_get_frame(scin)), p);
 }
 
 
@@ -943,6 +943,19 @@ static int in_macro(SCInterpreter *scin)
 }
 
 
+static void add_newpara(struct frame *fr, SCBlock *bl)
+{
+       Paragraph *last_para;
+
+       if ( fr->paras == NULL ) return;
+       last_para = fr->paras[fr->n_paras-1];
+
+       set_newline_at_end(last_para, bl);
+
+       create_paragraph(fr);
+}
+
+
 /* Add the SCBlock to the text in 'frame', at the end */
 static int add_text(struct frame *fr, PangoContext *pc, SCBlock *bl,
                     PangoLanguage *lang, int editable, SCInterpreter *scin)
@@ -952,6 +965,7 @@ static int add_text(struct frame *fr, PangoContext *pc, SCBlock *bl,
        double *col;
        struct sc_state *st = &scin->state[scin->j];
        SCBlock *rbl;
+       Paragraph *para;
 
        /* Empty block? */
        if ( text == NULL ) return 1;
@@ -959,13 +973,18 @@ static int add_text(struct frame *fr, PangoContext *pc, SCBlock *bl,
        fontdesc = sc_interp_get_fontdesc(scin);
        col = sc_interp_get_fgcol(scin);
 
-       Paragraph *para = last_open_para(fr);
+       para = last_para(fr);
+       if ( (para == NULL) || (para_type(para) != PARA_TYPE_TEXT) ) {
+               /* Last paragraph is not text.
+                *  or: no paragraphs yet.
+                *    Either way: Create the first one */
+               para = create_paragraph(fr);
+       }
 
        rbl = bl;
        if ( st->macro_real_block != NULL ) {
                bl = st->macro_real_block;
        }
-
        add_run(para, bl, rbl, fontdesc, col);
        set_para_spacing(para, st->paraspace);