poldek: poldek/pkgu.c - fixed bug reported in http://lists.pld-lin...

mis mis at pld-linux.org
Sun Jun 24 13:25:27 CEST 2007


Author: mis                          Date: Sun Jun 24 11:25:27 2007 GMT
Module: poldek                        Tag: HEAD
---- Log message:
- fixed bug reported in http://lists.pld-linux.org/mailman/pipermail/pld-devel-en/2007-June/019170.html
- improved understandability

---- Files affected:
poldek/poldek:
   pkgu.c (1.33 -> 1.34) 

---- Diffs:

================================================================
Index: poldek/poldek/pkgu.c
diff -u poldek/poldek/pkgu.c:1.33 poldek/poldek/pkgu.c:1.34
--- poldek/poldek/pkgu.c:1.33	Fri Jun 22 18:36:42 2007
+++ poldek/poldek/pkgu.c	Sun Jun 24 13:25:22 2007
@@ -35,8 +35,8 @@
 #define NA_OWNED             (1 << 0)
 #define RECODE_SUMMMARY      (1 << 1) /* needs to be recoded */
 #define RECODE_DESCRIPTION   (1 << 2)
-#define RECODED_SUMMMARY     (1 << 3) /* already recoded     */
-#define RECODED_DESCRIPTION  (1 << 4)
+#define SUMMARY_RECODED     (1 << 3) /* already recoded     */
+#define DESCRITPION_RECODED  (1 << 4)
 
 struct pkguinf {
     char              *license;
@@ -125,13 +125,13 @@
     }
     
     if (pkgu->_summary) {
-        if (pkgu->_flags & RECODED_SUMMMARY)
+        if (pkgu->_flags & SUMMARY_RECODED)
             free(pkgu->_summary);
         pkgu->_summary = NULL;
     }
 
     if (pkgu->_description) {
-        if (pkgu->_flags & RECODED_DESCRIPTION)
+        if (pkgu->_flags & DESCRITPION_RECODED)
             free(pkgu->_description);
         pkgu->_description = NULL;
     }
@@ -161,19 +161,19 @@
                                const char *lang)
 {
     char **member = NULL;
-    unsigned flag = 0, needflag = 0;
+    unsigned doneflag = 0, needflag = 0;
     char *usrencoding = NULL;
 
     switch (tag) {
         case PKGUINF_SUMMARY:
             member = &pkgu->_summary;
-            flag = RECODED_SUMMMARY;
+            doneflag = SUMMARY_RECODED;
             needflag = RECODE_SUMMMARY;
             break;
 
         case PKGUINF_DESCRIPTION:
             member = &pkgu->_description;
-            flag = RECODED_DESCRIPTION;
+            doneflag = DESCRITPION_RECODED;
             needflag = RECODE_SUMMMARY;
             break;
             
@@ -182,7 +182,7 @@
             break;
     }
 
-    if (*member && (pkgu->_flags & flag)) {
+    if (*member && (pkgu->_flags & doneflag)) {
         free((char*)*member);
         *member = NULL;
     }
@@ -205,8 +205,8 @@
 
 static char *recode(const char *val, const char *valencoding) 
 {
-    char *p, *val_utf8, *usrencoding;
-    size_t vlen, u_vlen;
+    char *p, *val_utf8, *usrencoding, *tmpval;
+    size_t vlen, u_vlen, tmpvlen;
     iconv_t cd;
 
     usrencoding = nl_langinfo(CODESET);
@@ -215,16 +215,20 @@
 
     valencoding = "UTF-8";   /* XXX, support for others needed? */
 
-    u_vlen = vlen = strlen(val);
+    vlen = u_vlen = tmpvlen = strlen(val);
     p = val_utf8 = n_malloc(u_vlen + 1);
 
+    /* FIXME: iconv leave val content untouched */ 
+    tmpval = (char*) val; 
+    
     cd = iconv_open(usrencoding, valencoding);
-    if (iconv(cd, (char**)&val, &vlen, &p, &u_vlen) == (size_t)-1) {
+    if (iconv(cd, &tmpval, &tmpvlen, &p, &u_vlen) == (size_t)-1) {
         iconv_close(cd);
         free(val_utf8);
         return (char*)val;
     }
     iconv_close(cd);
+    n_assert(p <= val_utf8 + vlen);
     *p = '\0';
     return val_utf8;
 }
@@ -534,7 +538,7 @@
 const char *pkguinf_get(const struct pkguinf *pkgu, int tag)
 {
     char **val = NULL;     /* for summary, description recoding */
-    unsigned flag = 0, needflag = 0;
+    unsigned doneflag = 0, needflag = 0;
     
     switch (tag) {
         case PKGUINF_LICENSE:
@@ -554,13 +558,13 @@
             
         case PKGUINF_SUMMARY:
             val = (char**)&pkgu->_summary;
-            flag = RECODED_SUMMMARY;
+            doneflag = SUMMARY_RECODED;
             needflag = RECODE_SUMMMARY;
             break;
 
         case PKGUINF_DESCRIPTION:
             val = (char**)&pkgu->_description;
-            flag = RECODED_DESCRIPTION;
+            doneflag = DESCRITPION_RECODED;
             needflag = RECODE_DESCRIPTION;
             break;
             
@@ -571,7 +575,9 @@
     }
 
     if (val) { /* something to recode? */
+        struct pkguinf *uinf = (struct pkguinf *)pkgu;/* disable const, ugly */
         char *recoded = NULL;
+        
 
         /* already recoded or no recoding needed */
         if ((pkgu->_flags & needflag) == 0) 
@@ -579,11 +585,11 @@
 
         recoded = recode(*val, NULL);
         if (recoded && recoded != *val) {
-            ((struct pkguinf *)(pkgu))->_flags &= ~needflag; /* XXX ugly */
-            ((struct pkguinf *)(pkgu))->_flags |= ~flag;
+            uinf->_flags |= doneflag; /* free() needed */
             *val = recoded;
         }
         
+        uinf->_flags &= ~needflag; /* do not try anymore */
         return *val;
     }
 
================================================================

---- CVS-web:
    http://cvs.pld-linux.org/poldek/poldek/pkgu.c?r1=1.33&r2=1.34&f=u



More information about the pld-cvs-commit mailing list