Enlightenment CVS committal

Author  : rbdpngn
Project : e17
Module  : libs/etox

Dir     : e17/libs/etox/src


Modified Files:
        Etox.h etox.c etox_line.c etox_obstacle.c etox_obstacle.h 


Log Message:
Fixed up the segv's in etox_test that I am experiencing, which was in
etox_append_text. Also simplified the test program by removing the buggy
slide-in code, it was too slow when testing over the network anyways. Let me
know if you experience segfaults.

===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/etox/src/Etox.h,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -3 -r1.33 -r1.34
--- Etox.h      23 Jul 2003 16:37:39 -0000      1.33
+++ Etox.h      26 Jul 2003 06:35:21 -0000      1.34
@@ -38,18 +38,6 @@
 };
 
 /*
- * Etox obstacles keep track of the lines that they intersect and the bit that
- * represents it.
- */
-typedef struct _etox_obstacle Etox_Obstacle;
-struct _etox_obstacle
-{
-       Estyle *bit;
-       int start_line;
-       int end_line;
-};
-
-/*
  * The info structure keeps the important information about the style, but not
  * the bits used to display the text.
  */
@@ -209,6 +197,19 @@
 };
 
 /*
+ * Etox obstacles keep track of the lines that they intersect and the bit that
+ * represents it.
+ */
+typedef struct _etox_obstacle Etox_Obstacle;
+struct _etox_obstacle
+{
+       Etox *et;
+       Estyle *bit;
+       int start_line;
+       int end_line;
+};
+
+/*
  * Selection are used to manipulate previously composed etox, it is
  * recommended to keep the number of active selections to a minimum, and if
  * possible, compose using contexts and setup time.
@@ -340,10 +341,9 @@
  * Obstacle manipulation functions
  */
 Etox_Obstacle *etox_obstacle_add(Etox * et, int x, int y, int w, int h);
-void etox_obstacle_remove(Etox * et, Etox_Obstacle * obstacle);
-void etox_obstacle_move(Etox * et, Etox_Obstacle * obstacle, int x, int y);
-void etox_obstacle_resize(Etox * et, Etox_Obstacle * obstacle, int w,
-                         int h);
+void etox_obstacle_remove(Etox_Obstacle * obstacle);
+void etox_obstacle_move(Etox_Obstacle * obstacle, int x, int y);
+void etox_obstacle_resize(Etox_Obstacle * obstacle, int w, int h);
 
 /*
  * These functions select regions of the etox.
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/etox/src/etox.c,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -3 -r1.43 -r1.44
--- etox.c      24 Jul 2003 05:34:44 -0000      1.43
+++ etox.c      26 Jul 2003 06:35:21 -0000      1.44
@@ -189,9 +189,8 @@
  */
 void etox_append_text(Etox * et, char *text)
 {
-       Evas_List *lines, *l, *ll;
+       Evas_List *lines, *l;
        Etox_Line *end = NULL, *start;
-       int i;
 
        CHECK_PARAM_POINTER("et", et);
        CHECK_PARAM_POINTER("text", text);
@@ -201,37 +200,40 @@
         * new text with the last line of the old text.
         */
        lines = _etox_break_text(et, text);
+       if (!lines)
+               return;
+
        for (l = et->lines; l; l = l->next)
                end = l->data;
-       et->lines = evas_list_remove(et->lines, end);
 
-       for (i = 0, ll = lines; ll; ll = ll->next, i++) {
-               if (i == 0) {
-                       start = ll->data;
+       start = lines->data;
+       lines = evas_list_remove(lines, start);
 
-                       /*
-                        * Need to adjust the height and length of the line to reflect 
the
-                        * text that was added.
-                        */
-                       et->length -= start->length;
-                       et->h -= start->h;
-                       etox_line_merge(start, end);
-                       et->length += start->length;
-                       et->h += start->h;
-                       et->lines = evas_list_append(et->lines, start);
-               } else {
-                       start = ll->data;
+       /*
+        * Need to adjust the length, height, and width of the line to reflect
+        * the text that was added.
+        */
+       et->length -= end->length;
+       et->h -= start->h;
+       etox_line_merge(end, start);
+       et->length += end->length;
+       et->h += start->h;
+       if (end->w > et->w)
+               et->w = end->w;
 
-                       /*
-                        * Now add the remaining lines to the end of the line list.
-                        */
-                       if (start->w > et->w)
-                               et->w = start->w;
+       while (lines) {
+               start = lines->data;
 
-                       et->h += start->h;
-                       et->length += start->length;
-                       et->lines = evas_list_append(et->lines, start);
-               }
+               /*
+                * Now add the remaining lines to the end of the line list.
+                */
+               if (start->w > et->w)
+                       et->w = start->w;
+
+               et->h += start->h;
+               et->length += start->length;
+               et->lines = evas_list_append(et->lines, start);
+               lines = evas_list_remove(lines, start);
        }
 
        /*
@@ -679,8 +681,9 @@
  * @w: a pointer to an int to store the width of the etox
  * @h: a pointer to an int to store the height of the etox
  *
- * Returns no value. Stores the geometry of the letter at coordinates @xc, @yc
- * in @et into the integers pointed to by @x, @y, @w, and @h.
+ * Returns the index in the text of the found character. Stores the geometry
+ * of the letter at coordinates @xc, @yc in @et into the integers pointed to by
+ * @x, @y, @w, and @h.
  */
 int etox_coord_to_geometry(Etox * et, int xc, int yc, int *x, int *y,
                           int *w, int *h)
@@ -797,8 +800,8 @@
  * @w: the width of the obstacle
  * @h: the height of the obstacle
  *
- * Returns no value. Adds an obstacle to the etox @et that the text will wrap
- * around.
+ * Returns a pointer to the new obstacle object on success, NULL on failure.
+ * Adds an obstacle to the etox @et that the text will wrap around.
  */
 Etox_Obstacle *etox_obstacle_add(Etox * et, int x, int y, int w, int h)
 {
@@ -808,9 +811,10 @@
 
        obst = etox_obstacle_new(et, x, y, w, h);
 
-       evas_list_append(et->obstacles, obst);
-
-       etox_obstacle_place(et, obst);
+       if (obst) {
+               evas_list_append(et->obstacles, obst);
+               etox_obstacle_place(obst);
+       }
 
        return obst;
 }
@@ -823,14 +827,14 @@
  * Returns no value. Removes an obstacle from the etox and updates any lines
  * surrounding it.
  */
-void etox_obstacle_remove(Etox * et, Etox_Obstacle * obstacle)
+void etox_obstacle_remove(Etox_Obstacle * obstacle)
 {
-       CHECK_PARAM_POINTER("et", et);
        CHECK_PARAM_POINTER("obstacle", obstacle);
 
-       et->obstacles = evas_list_remove(et->obstacles, obstacle);
+       obstacle->et->obstacles = evas_list_remove(obstacle->et->obstacles,
+                       obstacle);
 
-       etox_obstacle_free(et, obstacle);
+       etox_obstacle_free(obstacle->et, obstacle);
 }
 
 /**
@@ -843,14 +847,13 @@
  * Returns no value. Changes the position information for @obst and updates the
  * etox to work around the new position.
  */
-void etox_obstacle_move(Etox * et, Etox_Obstacle * obst, int x, int y)
+void etox_obstacle_move(Etox_Obstacle * obst, int x, int y)
 {
-       CHECK_PARAM_POINTER("et", et);
        CHECK_PARAM_POINTER("obst", obst);
 
        estyle_move(obst->bit, x, y);
-       etox_obstacle_unplace(et, obst);
-       etox_obstacle_place(et, obst);
+       etox_obstacle_unplace(obst);
+       etox_obstacle_place(obst);
 }
 
 /**
@@ -863,10 +866,13 @@
  * Returns no value. Changes the size information for @obst and updates the
  * etox to work around the new position.
  */
-void etox_obstacle_resize(Etox * et, Etox_Obstacle * obst, int x, int y)
+void etox_obstacle_resize(Etox_Obstacle * obst, int x, int y)
 {
-       CHECK_PARAM_POINTER("et", et);
        CHECK_PARAM_POINTER("obst", obst);
+
+       /*
+        * FIXME: Need to fill in the meat of this function
+        */
 }
 
 /*
@@ -874,8 +880,8 @@
  * @et: the etox that will contain the text
  * @text: the text that will be broken up into bits
  *
- * Returns no value. Separates the text into lines and bits if specific
- * characters are contained in the text.
+ * Returns a list of lines on success, NULL on failure. Separates the text into
+ * lines and bits if specific characters are contained in the text.
  */
 static Evas_List *_etox_break_text(Etox * et, char *text)
 {
@@ -1151,6 +1157,13 @@
        Evas_List *l;
 
        CHECK_PARAM_POINTER("et", et);
+
+       /*
+        * What the hell, do you expect us to "just know" what text to
+        * display, you've got to set some dumbass!
+        */
+       if (!et->lines)
+               return;
 
        /*
         * Begin by rewrapping the necessary lines.
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/etox/src/etox_line.c,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -3 -r1.12 -r1.13
--- etox_line.c 24 Jul 2003 01:46:42 -0000      1.12
+++ etox_line.c 26 Jul 2003 06:35:21 -0000      1.13
@@ -264,7 +264,6 @@
 void etox_line_merge(Etox_Line * line1, Etox_Line * line2)
 {
        Estyle *bit;
-       Evas_List *l;
 
        CHECK_PARAM_POINTER("line1", line1);
        CHECK_PARAM_POINTER("line2", line2);
@@ -272,9 +271,10 @@
        /*
         * Move the bits from line2 to line1.
         */
-       for (l = line2->bits; l; l = l->next) {
-               bit = l->data;
+       while (line2->bits) {
+               bit = line2->bits->data;
                line1->bits = evas_list_append(line1->bits, bit);
+               line2->bits = evas_list_remove(line2->bits, bit);
        }
        /*
         * Adjust the height, width and length of the merged line.
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/etox/src/etox_obstacle.c,v
retrieving revision 1.11
retrieving revision 1.12
diff -u -3 -r1.11 -r1.12
--- etox_obstacle.c     23 Jul 2003 06:46:17 -0000      1.11
+++ etox_obstacle.c     26 Jul 2003 06:35:21 -0000      1.12
@@ -26,6 +26,7 @@
         */
        obst = (Etox_Obstacle *) calloc(1, sizeof(Etox_Obstacle));
        if (obst) {
+               obst->et = et;
                obst->bit = estyle_new(et->evas, "", NULL);
                estyle_fix_geometry(obst->bit, x, y, w, h);
        }
@@ -40,7 +41,7 @@
 {
        CHECK_PARAM_POINTER("obstacle", obstacle);
 
-       etox_obstacle_unplace(et, obstacle);
+       etox_obstacle_unplace(obstacle);
 
        FREE(obstacle);
 }
@@ -52,7 +53,7 @@
  *
  * Returns no value. Places the obstacle @obst within the lines of etox @et.
  */
-void etox_obstacle_place(Etox * et, Etox_Obstacle * obst)
+void etox_obstacle_place(Etox_Obstacle * obst)
 {
        int i = 0;
        int j = 0;
@@ -60,7 +61,6 @@
        Etox_Line *line;
        Evas_List *l_nodes, *l;
 
-       CHECK_PARAM_POINTER("et", et);
        CHECK_PARAM_POINTER("obst", obst);
 
        /*
@@ -68,23 +68,23 @@
         * outside of the etox.
         */
        estyle_geometry(obst->bit, &x, &y, &w, &h);
-       if (x > et->x + et->w)
+       if (x > obst->et->x + obst->et->w)
                return;
 
-       if (x + w < et->x)
+       if (x + w < obst->et->x)
                return;
 
-       if (y > et->y + et->h)
+       if (y > obst->et->y + obst->et->h)
                return;
 
-       if (y + h < et->y)
+       if (y + h < obst->et->y)
                return;
 
        /*
         * We know the obstacle intersects this etox, so now determine
         * starting and ending lines, as well as split lines appropriately.
         */
-       for (l_nodes = et->lines; l_nodes; l_nodes = l_nodes->next)
+       for (l_nodes = obst->et->lines; l_nodes; l_nodes = l_nodes->next)
                j++;
        obst->start_line = j;
        obst->end_line = -1;
@@ -93,7 +93,7 @@
         * Run through to determine the lines to determine which intersect the
         * obstacle
         */
-       for (l = et->lines; l; l = l->next) {
+       for (l = obst->et->lines; l; l = l->next) {
                line = l->data;
                if (line->y < y + h) {
                        if (line->y > y) {
@@ -119,14 +119,13 @@
 /*
  * etox_obstacle_unplace - set empty positioning on an obstacle in the etox
  */
-void etox_obstacle_unplace(Etox * et, Etox_Obstacle * obst)
+void etox_obstacle_unplace(Etox_Obstacle * obst)
 {
        int i, j;
        Estyle *bit;
        Etox_Line *line;
        Evas_List *l, *ll;
 
-       CHECK_PARAM_POINTER("et", et);
        CHECK_PARAM_POINTER("obst", obst);
 
        /*
@@ -138,7 +137,7 @@
         * On each line within the obstacle bounds, remove the obstacle from
         * the list of bits.
         */
-       for (j = 1, l = et->lines; j <= obst->end_line && l;
+       for (j = 1, l = obst->et->lines; j <= obst->end_line && l;
             l = l->next, j++) {
                if (j < i);
                else {
@@ -185,8 +184,8 @@
                        if (!bit)
                                return;
                        /*
-                        * FIXME: We need to do some bit-splitting here, just need to 
get
-                        * around to it.
+                        * FIXME: We need to do some bit-splitting here, just
+                        * need to get around to it.
                         */
                        l = evas_list_prepend_relative(l, obst->bit, l->next);
                        break;
===================================================================
RCS file: /cvsroot/enlightenment/e17/libs/etox/src/etox_obstacle.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -3 -r1.2 -r1.3
--- etox_obstacle.h     25 Apr 2002 16:32:01 -0000      1.2
+++ etox_obstacle.h     26 Jul 2003 06:35:21 -0000      1.3
@@ -3,8 +3,8 @@
 
 Etox_Obstacle *etox_obstacle_new(Etox * line, int x, int y, int w, int h);
 void etox_obstacle_free(Etox * et, Etox_Obstacle * obstacle);
-void etox_obstacle_place(Etox * et, Etox_Obstacle * obst);
-void etox_obstacle_unplace(Etox * et, Etox_Obstacle * obst);
+void etox_obstacle_place(Etox_Obstacle * obst);
+void etox_obstacle_unplace(Etox_Obstacle * obst);
 inline int etox_rect_intersect(int x1, int y1, int w1, int h1,
                               int x2, int y2, int w2, int h2);
 




-------------------------------------------------------
This SF.Net email sponsored by: Free pre-built ASP.NET sites including
Data Reports, E-commerce, Portals, and Forums are available now.
Download today and enter to win an XBOX or Visual Studio .NET.
http://aspnet.click-url.com/go/psa00100003ave/direct;at.aspnet_072303_01/01
_______________________________________________
enlightenment-cvs mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs

Reply via email to