bug-gnu-utils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: gawk 3.1.5, patch for multibyte locales


From: Karel Zak
Subject: Re: gawk 3.1.5, patch for multibyte locales
Date: Mon, 24 Jul 2006 15:09:41 +0200
User-agent: Mutt/1.5.11

On Sun, Jul 23, 2006 at 10:30:56PM +0300, Aharon Robbins wrote:
> Greetings all.
> 
> The problem with gawk and multibyte locales has come up enough that it's
> time to post a patch.  This is extracted from my current code base.
                                        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

 Well, when we talk about code base -- I have a logical question:
 where and how people can access this development code base? Is there
 any CVS/hg/git repository?

 [Sorry, if this question is bad question:-)]
 
    Karel

> 
> At least now it'll be in the mailing list archives.
> 
> Arnold
> -------------------------------
> Fri Mar 10 06:28:23 2006  Arnold D. Robbins  <address@hidden>
> 
>       * awk.h (free_wstr): New declaration if MBS_SUPPORT, empty macro
>       otherwise.
>       * node.c (free_wstr): New function, inside MBS_SUPPORT. Frees the wide
>       string part of a node. Provided so that it can be used consistently
>       everywhere.
>       (format_val, r_dupnode, mk_number, make_str_node, unref): Use it.
>       * builtin.c (sub_common): Call `free_wstr' instead of doing it manually.
>       * eval.c (r_tree_eval): Same in Node_assign_concat case.
>       * field.c (set_field, rebuild_record, set_record): Add calls to 
> `free_wstr'.
> 
> Mon Feb 13 22:45:34 2006  Arnold D. Robbins  <address@hidden>
> 
>       * eval.c (r_tree_eval): Node_assign_concat. Release any
>       wide string value and reset the WSTRCUR flag. Based on
>       bug report by Karal Zak.
> 
> diff -u ../gawk-3.1.5/awk.h ./awk.h
> --- ../gawk-3.1.5/awk.h       2005-07-26 21:07:43.000000000 +0300
> +++ ./awk.h   2006-03-10 06:35:14.000000000 +0200
> @@ -1166,6 +1166,9 @@
>  #define force_wstring(n)     str2wstr(n, NULL)
>  extern const wchar_t *wstrstr P((const wchar_t *haystack, size_t hs_len, 
> const wchar_t *needle, size_t needle_len));
>  extern const wchar_t *wcasestrstr P((const wchar_t *haystack, size_t hs_len, 
> const wchar_t *needle, size_t needle_len));
> +extern void free_wstr P((NODE *n));
> +#else
> +#define free_wstr(NODE)      /* empty */
>  #endif
>  /* re.c */
>  extern Regexp *make_regexp P((const char *s, size_t len, int ignorecase, int 
> dfa));
> diff -u ../gawk-3.1.5/builtin.c ./builtin.c
> --- ../gawk-3.1.5/builtin.c   2005-07-26 21:07:43.000000000 +0300
> +++ ./builtin.c       2006-03-10 06:55:00.000000000 +0200
> @@ -2462,6 +2462,7 @@
>       free(t->stptr);
>       t->stptr = buf;
>       t->stlen = textlen;
> +     free_wstr(t);
>  
>       free_temp(s);
>       if (matches > 0 && lhs) {
> diff -u ../gawk-3.1.5/eval.c ./eval.c
> --- ../gawk-3.1.5/eval.c      2005-07-26 21:07:43.000000000 +0300
> +++ ./eval.c  2006-07-04 22:41:25.000000000 +0300
> @@ -1176,6 +1176,7 @@
>                       memcpy(l->stptr + l->stlen, r->stptr, r->stlen);
>                       l->stlen += r->stlen;
>                       l->stptr[l->stlen] = '\0';
> +                     free_wstr(l);
>               } else {
>                       char *nval;
>                       size_t nlen = l->stlen + r->stlen + 2;
> diff -u ../gawk-3.1.5/field.c ./field.c
> --- ../gawk-3.1.5/field.c     2005-05-11 18:28:15.000000000 +0300
> +++ ./field.c 2006-03-10 06:48:22.000000000 +0200
> @@ -129,6 +129,7 @@
>       n->stptr = str;
>       n->stlen = len;
>       n->flags = (STRCUR|STRING|MAYBE_NUM|FIELD);
> +     free_wstr(n);
>  }
>  
>  /* rebuild_record --- Someone assigned a value to $(something).
> @@ -210,6 +211,7 @@
>                       }
>  
>                       n->stptr = cops;
> +                     free_wstr(n);
>                       unref(fields_arr[i]);
>                       fields_arr[i] = n;
>               }
> @@ -273,6 +275,7 @@
>       n->type = Node_val;
>       n->stfmt = -1;
>       n->flags = (STRING|STRCUR|MAYBE_NUM|FIELD);
> +     free_wstr(n);
>       fields_arr[0] = n;
>  
>  #undef INITIAL_SIZE
> diff -u ../gawk-3.1.5/node.c ./node.c
> --- ../gawk-3.1.5/node.c      2005-07-26 21:07:43.000000000 +0300
> +++ ./node.c  2006-03-10 07:04:25.000000000 +0200
> @@ -216,15 +218,7 @@
>  no_malloc:
>       s->stref = 1;
>       s->flags |= STRCUR;
> -#if defined MBS_SUPPORT
> -     if ((s->flags & WSTRCUR) != 0) {
> -             assert(s->wstptr != NULL);
> -             free(s->wstptr);
> -             s->wstptr = NULL;
> -             s->wstlen = 0;
> -             s->flags &= ~WSTRCUR;
> -     }
> -#endif
> +     free_wstr(s);
>       return s;
>  }
>  
> @@ -287,7 +281,12 @@
>       *r = *n;
>       r->flags &= ~(PERM|TEMP|FIELD);
>       r->flags |= MALLOC;
> -#if defined MBS_SUPPORT
> +#ifdef MBS_SUPPORT
> +     /*
> +      * DON'T call free_wstr(r) here!
> +      * r->wstptr still points at n->wstptr's value, and we
> +      * don't want to free it!
> +      */
>       r->wstptr = NULL;
>  #endif /* defined MBS_SUPPORT */
>       if (n->type == Node_val && (n->flags & STRCUR) != 0) {
> @@ -344,11 +343,7 @@
>       r->stref = 1;
>       r->stptr = NULL;
>       r->stlen = 0;
> -#if defined MBS_SUPPORT
> -     r->wstptr = NULL;
> -     r->wstlen = 0;
> -     r->flags &= ~WSTRCUR;
> -#endif /* MBS_SUPPORT */
> +     free_wsptr(r);
>  #endif /* GAWKDEBUG */
>       return r;
>  }
> @@ -363,10 +358,7 @@
>       getnode(r);
>       r->type = Node_val;
>       r->flags = (STRING|STRCUR|MALLOC);
> -#if defined MBS_SUPPORT
> -     r->wstptr = NULL;
> -     r->wstlen = 0;
> -#endif
> +     free_wstr(r);
>       if (flags & ALREADY_MALLOCED)
>               r->stptr = s;
>       else {
> @@ -510,15 +502,7 @@
>                               return;
>                       }
>                       free(tmp->stptr);
> -#if defined MBS_SUPPORT
> -                     if (tmp->wstptr != NULL) {
> -                             assert((tmp->flags & WSTRCUR) != 0);
> -                             free(tmp->wstptr);
> -                     }
> -                     tmp->flags &= ~WSTRCUR;
> -                     tmp->wstptr = NULL;
> -                     tmp->wstlen = 0;
> -#endif
> +                     free_wstr(tmp);
>               }
>               freenode(tmp);
>               return;
> @@ -775,6 +759,21 @@
>       return n;
>  }
>  
> +/* free_wstr --- release the wide string part of a node */
> +
> +void
> +free_wstr(NODE *n)
> +{
> +
> +     if ((n->flags & WSTRCUR) != 0) {
> +             assert(n->wstptr != NULL);
> +             free(n->wstptr);
> +     }
> +     n->wstptr = NULL;
> +     n->wstlen = 0;
> +     n->flags &= ~WSTRCUR;
> +}
> +
>  #if 0
>  static void
>  dump_wstr(FILE *fp, const wchar_t *str, size_t len)
> 
> 
> _______________________________________________
> address@hidden
> http://lists.gnu.org/mailman/listinfo/bug-gnu-utils

-- 
 Karel Zak  <address@hidden>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]