On November 24, 2002 02:06 pm, Derick Rethans wrote: > On Sun, 24 Nov 2002, Ilia Alshanetsky wrote: > > iliaa Sat Nov 23 20:15:35 2002 EDT > > > > Modified files: > > /php4/ext/gd/libgd gdft.c > > Log: > > Fixed 3 memory leaks. > > Formatted the code to meet PHP's coding standards, which makes it MUCH > > easier to understand. > > But it also makes back porting patched to the real GD _much_ harder, and > that's why we didn't change the coding style yet AFAIK. >
The bundled GD has already undergone a number of major modifications and as we implement the PHP memory wrappers around memory allocation & handling that difference will only increase. GD 2.0.4 and later already differ significantly because the code has been 'cleaned-up' by the gd authors, so I do not believe this is a big concern. On the plus side by increasing the readability of the code it would be possible to easily to port a few changes that do happen. As we speak, I am working on porting gd 2.0.7 code changes to 2.0.4 and I can tell you doing diff + patch does not work @ all, beyond very small chucks of code. Ilia > Derick > > > Index: php4/ext/gd/libgd/gdft.c > > diff -u php4/ext/gd/libgd/gdft.c:1.13 php4/ext/gd/libgd/gdft.c:1.14 > > --- php4/ext/gd/libgd/gdft.c:1.13 Sun Nov 17 14:45:10 2002 > > +++ php4/ext/gd/libgd/gdft.c Sat Nov 23 20:15:34 2002 > > @@ -330,153 +330,147 @@ > > return (strcmp (a->fontlist, b->fontlist) == 0); > > } > > > > -static void * > > -fontFetch (char **error, void *key) > > +static void *fontFetch (char **error, void *key) > > { > > - font_t *a; > > - fontkey_t *b = (fontkey_t *) key; > > - int n; > > - int font_found = 0; > > - unsigned short platform, encoding; > > - char *fontsearchpath, *fontlist; > > - char *fullname = NULL; > > - char *name, *path, *dir; > > - char *strtok_ptr; > > - FT_Error err; > > - FT_CharMap found = 0; > > - FT_CharMap charmap; > > - > > - a = (font_t *) gdMalloc (sizeof (font_t)); > > - a->fontlist = gdEstrdup (b->fontlist); > > - a->library = b->library; > > - > > - /* > > - * Search the pathlist for any of a list of font names. > > - */ > > - fontsearchpath = getenv ("GDFONTPATH"); > > - if (!fontsearchpath) > > - fontsearchpath = DEFAULT_FONTPATH; > > - fontlist = gdEstrdup (a->fontlist); > > - > > - /* > > - * Must use gd_strtok_r else pointer corrupted by strtok in nested > > loop. - */ > > - for (name = gd_strtok_r (fontlist, LISTSEPARATOR, &strtok_ptr); name; > > - name = gd_strtok_r (0, LISTSEPARATOR, &strtok_ptr)) > > - { > > - > > - /* make a fresh copy each time - strtok corrupts it. */ > > - path = gdEstrdup (fontsearchpath); > > - /* > > - * Allocate an oversized buffer that is guaranteed to be > > - * big enough for all paths to be tested. > > - */ > > - fullname = gdRealloc (fullname, > > - strlen (fontsearchpath) + strlen (name) + 6); > > - /* if name is an absolute filename then test directly */ > > - if (*name == '/' || (name[0] != 0 && name[1] == ':' && (name[2] == > > '/' || name[2] == '\\'))) - { > > - sprintf (fullname, "%s", name); > > - if (access (fullname, R_OK) == 0) > > - { > > - font_found++; > > - break; > > - } > > - } > > - for (dir = strtok (path, PATHSEPARATOR); dir; > > - dir = strtok (0, PATHSEPARATOR)) > > - { > > - sprintf (fullname, "%s/%s.ttf", dir, name); > > - if (access (fullname, R_OK) == 0) > > - { > > - font_found++; > > - break; > > - } > > - sprintf (fullname, "%s/%s.pfa", dir, name); > > - if (access (fullname, R_OK) == 0) > > - { > > - font_found++; > > - break; > > - } > > - sprintf (fullname, "%s/%s.pfb", dir, name); > > - if (access (fullname, R_OK) == 0) > > - { > > - font_found++; > > - break; > > - } > > - } > > - gdFree (path); > > - if (font_found) > > - break; > > - } > > - gdFree (fontlist); > > - if (!font_found) > > - { > > - *error = "Could not find/open font"; > > - return NULL; > > - } > > - > > - err = FT_New_Face (*b->library, fullname, 0, &a->face); > > - if (err) > > - { > > - *error = "Could not read font"; > > - return NULL; > > - } > > - gdFree (fullname); > > - > > -/* FIXME - This mapping stuff is imcomplete - where is the spec? */ > > - > > - a->have_char_map_unicode = 0; > > - a->have_char_map_big5 = 0; > > - a->have_char_map_sjis = 0; > > - a->have_char_map_apple_roman = 0; > > - for (n = 0; n < a->face->num_charmaps; n++) > > - { > > - charmap = a->face->charmaps[n]; > > - platform = charmap->platform_id; > > - encoding = charmap->encoding_id; > > - if ((platform == 3 && encoding == 1) /* Windows Unicode */ > > - || (platform == 3 && encoding == 0) /* Windows Symbol */ > > - || (platform == 2 && encoding == 1) /* ISO Unicode */ > > - || (platform == 0)) > > - { /* Apple Unicode */ > > - a->have_char_map_unicode = 1; > > - found = charmap; > > - } > > - else if (platform == 3 && encoding == 4) > > - { /* Windows Big5 */ > > - a->have_char_map_big5 = 1; > > - found = charmap; > > - } > > - else if (platform == 3 && encoding == 2) > > - { /* Windows Sjis */ > > - a->have_char_map_sjis = 1; > > - found = charmap; > > - } > > - else if ((platform == 1 && encoding == 0) /* Apple Roman */ > > - || (platform == 2 && encoding == 0)) > > - { /* ISO ASCII */ > > - a->have_char_map_apple_roman = 1; > > - found = charmap; > > - } > > - } > > - if (!found) > > - { > > - *error = "Unable to find a CharMap that I can handle"; > > - return NULL; > > - } > > + font_t *a; > > + fontkey_t *b = (fontkey_t *) key; > > + int n; > > + int font_found = 0; > > + unsigned short platform, encoding; > > + char *fontsearchpath, *fontlist; > > + char *fullname = NULL; > > + char *name, *path=NULL, *dir; > > + char *strtok_ptr; > > + FT_Error err; > > + FT_CharMap found = 0; > > + FT_CharMap charmap; > > + > > + a = (font_t *) gdPMalloc(sizeof(font_t)); > > + a->fontlist = gdPEstrdup(b->fontlist); > > + a->library = b->library; > > + > > + /* > > + * Search the pathlist for any of a list of font names. > > + */ > > + fontsearchpath = getenv ("GDFONTPATH"); > > + if (!fontsearchpath) { > > + fontsearchpath = DEFAULT_FONTPATH; > > + } > > + fontlist = gdEstrdup(a->fontlist); > > + > > + /* > > + * Must use gd_strtok_r else pointer corrupted by strtok in nested > > loop. + */ > > + for (name = gd_strtok_r (fontlist, LISTSEPARATOR, &strtok_ptr); name; > > name = gd_strtok_r (0, LISTSEPARATOR, &strtok_ptr)) { + /* make a fresh > > copy each time - strtok corrupts it. */ > > + path = gdEstrdup (fontsearchpath); > > + > > + /* > > + * Allocate an oversized buffer that is guaranteed to be > > + * big enough for all paths to be tested. > > + */ > > + fullname = gdRealloc (fullname, strlen (fontsearchpath) + strlen > > (name) + 6); + > > + /* if name is an absolute filename then test directly */ > > + if (*name == '/' || (name[0] != 0 && name[1] == ':' && (name[2] == '/' > > || name[2] == '\\'))) { + sprintf(fullname, "%s", name); > > + if (access(fullname, R_OK) == 0) { > > + font_found++; > > + break; > > + } > > + } > > + for (dir = strtok (path, PATHSEPARATOR); dir; dir = strtok (0, > > PATHSEPARATOR)) { + sprintf(fullname, "%s/%s.ttf", dir, name); > > + if (access (fullname, R_OK) == 0) { > > + font_found++; > > + break; > > + } > > + sprintf(fullname, "%s/%s.pfa", dir, name); > > + if (access(fullname, R_OK) == 0) { > > + font_found++; > > + break; > > + } > > + sprintf (fullname, "%s/%s.pfb", dir, name); > > + if (access(fullname, R_OK) == 0) { > > + font_found++; > > + break; > > + } > > + } > > + gdFree(path); > > + if (font_found) { > > + break; > > + } > > + } > > + > > + if (path) { > > + gdFree(path); > > + } > > + > > + gdFree(fontlist); > > + > > + if (!font_found) { > > + gdPFree(a->fontlist); > > + gdPFree(a); > > + *error = "Could not find/open font"; > > + return NULL; > > + } > > + > > + err = FT_New_Face (*b->library, fullname, 0, &a->face); > > + if (err) { > > + gdPFree(a->fontlist); > > + gdPFree(a); > > + *error = "Could not read font"; > > + return NULL; > > + } > > + gdFree(fullname); > > + > > + /* FIXME - This mapping stuff is imcomplete - where is the spec? */ > > + > > + a->have_char_map_unicode = 0; > > + a->have_char_map_big5 = 0; > > + a->have_char_map_sjis = 0; > > + a->have_char_map_apple_roman = 0; > > + for (n = 0; n < a->face->num_charmaps; n++) { > > + charmap = a->face->charmaps[n]; > > + platform = charmap->platform_id; > > + encoding = charmap->encoding_id; > > + if ((platform == 3 && encoding == 1) /* Windows Unicode */ > > + || (platform == 3 && encoding == 0) /* Windows Symbol */ > > + || (platform == 2 && encoding == 1) /* ISO Unicode */ > > + || (platform == 0)) > > + { /* Apple Unicode */ > > + a->have_char_map_unicode = 1; > > + found = charmap; > > + } else if (platform == 3 && encoding == 4) { /* Windows Big5 */ > > + a->have_char_map_big5 = 1; > > + found = charmap; > > + } else if (platform == 3 && encoding == 2) { /* Windows Sjis */ > > + a->have_char_map_sjis = 1; > > + found = charmap; > > + } else if ((platform == 1 && encoding == 0) /* Apple Roman */ > > + || (platform == 2 && encoding == 0)) > > + { /* ISO ASCII */ > > + a->have_char_map_apple_roman = 1; > > + found = charmap; > > + } > > + } > > + if (!found) { > > + gdPFree(a->fontlist); > > + gdPFree(a); > > + *error = "Unable to find a CharMap that I can handle"; > > + return NULL; > > + } > > > > - return (void *) a; > > + return (void *) a; > > } > > > > -static void > > -fontRelease (void *element) > > +static void fontRelease (void *element) > > { > > - font_t *a = (font_t *) element; > > + font_t *a = (font_t *) element; > > > > - FT_Done_Face (a->face); > > - gdFree (a->fontlist); > > - gdFree ((char *) element); > > + FT_Done_Face (a->face); > > + gdPFree(a->fontlist); > > + gdPFree((char *) element); > > } > > > > /********************************************************************/ > > > > > > > > -- > > PHP CVS Mailing List (http://www.php.net/) > > To unsubscribe, visit: http://www.php.net/unsub.php -- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php