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.

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
> 

-- 

-------------------------------------------------------------------------
 Derick Rethans                                 http://derickrethans.nl/ 
 PHP Magazine - The PHP Magazine for Professionals - http://php-mag.net/
-------------------------------------------------------------------------


-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to