Alternate content patch (2nd part)

From: Jose Kahan <Jose.Kahan_at_inrialpes.fr_at_hypermail-project.org>
Date: Thu, 1 Jul 1999 18:51:33 +0200 (MET DST)
Message-ID: <Pine.SOL.3.94.990701184538.18383A-200000_at_tuvalu.inrialpes.fr>


(Sorry for the multiple posting. I'm not sure if the mailing lists are working.)

Hello,

Yesterday I sent a patch. However, I noticed today that one of my changes in parse.c broke some of the MIME handling. Here's a new version of my parse.c patch, which fixes the problem.

Apply this patch against your CVS parse.c.

Cheers,

-Jose

! int preferedcontent(int *current_weight, char *type)   {

-   int weight;
-   int status;
- 
-   status = 0;
- 

    /* We let plain text remain PREFERED at all times */

!   if(!strcasecmp("text/plain", type)) {
!     if (*current_weight != 0) {
!       /* to avoid having two text/plain alternatives */
!       *current_weight = 0;
!       status = 1;
!     }
!   }
!   /* find the weight of the type arg. If the weight is
!      inferior to the current_weight, we make it the
!      prefered content */  
!   else if (set_prefered_types) {
!     weight = inlist_pos (set_prefered_types, type);
!     if (weight != -1) {
!       /* +1 so that weight 0 is reserved for text/plain */
!       weight++;
!       if (*current_weight == -1) {
! 	*current_weight = weight;
! 	status = 1;
!       }
!       else if (*current_weight > weight) {
! 	*current_weight = weight;
! 	status = 1;
!       }
!     }

    }   

! return status;
  }   

  int textcontent(char *type)
--- 85,105 ----

     return (inlist(set_inline_types, type));   }   

! int preferedcontent(char *type)
  {
    /* We let plain text remain PREFERED at all times */

!   if(!strcasecmp("text/plain", type))
!     return 1;
! 
!   /* 
!   ** Parsing for embedded html needs more work before we 
!   ** can actually do this... 
!   */
!   if(set_prefered_types) {
!     return (inlist(set_prefered_types, type));

    }   

! return 0;
  }   

  int textcontent(char *type)


    struct body *bp;
--- 897,906 ----


    char attachname[129]; /* for attachment file names */   

    char attachname[129]; /* for attachment file names */   


          /*
--- 1014,1020 ----

          /*


! 	    if (alternativeparser) {
! 	      struct body *next, *temp_bp;
! 	      
! 	      /* We are parsing alternatives... */
  
! 	      if(preferedcontent(&alternative_weight, type) ) {
! 		/* ... this is a prefered type, we want to store
                     this [instead of the earlier one]. */
  #if 0
! 		printf("%s is more fun than the previous one\n",
! 		       type);
  #endif
! 		/* erase the previous alternative info */
! 		temp_bp = alternative_bp; /* remember the value of bp for GC */
! 		alternative_bp = alternative_lp = NULL;
! 		alternative_lastfile_created = NO_FILE;
! 		content = CONTENT_UNKNOWN;
! 		if (alternative_lastfile[0] != '\0') {
! 		  /* remove the previous attachment */
! 		  unlink (alternative_lastfile);
! 		  alternative_lastfile[0] = '\0';
! 		}
                }
                else {
                  /* ...and this type is not a prefered one. Thus, we
                   * shall ignore it completely! */
                  content = CONTENT_IGNORE;
- 		/* erase the current alternative info */
- 		temp_bp = bp; /* remember the value of bp for GC */
- 		lp = alternative_lp;
- 		bp = alternative_bp; 
- 		strcpy (alternative_file, alternative_lastfile);
- 		file_created = alternative_lastfile_created;
- 		alternative_bp = alternative_lp = NULL;
- 		alternative_lastfile_created = NO_FILE;
- 		alternative_lastfile[0] = '\0';
- 		/* we haven't yet created any attachment file, so there's no need
- 		   to erase it yet */
                }
! 	      /* free any previous alternative */
! 	      while (temp_bp) {
! 		next = temp_bp->next;
! 		if (temp_bp->line) free (temp_bp->line);
! 		free (temp_bp);
! 		temp_bp = next;
! 	      }
! 	      /* _at_@ not sure if I should add a diff flag to do this break */
! 	      if (content == CONTENT_IGNORE)
! 		/* end the header parsing... we already know what we want */
! 		break;
!             }
! 
! 	    if (content == CONTENT_IGNORE)
! 	      continue;
! 	    else if (ignorecontent(type))
! 	      /* don't save this */
! 	      content = CONTENT_IGNORE;
              else if (textcontent(type) ||
                       (inlinehtml && !strcasecmp(type, "text/html"))) {
                /* text content or text/html follows.
--- 1135,1178 ----
                  charset = strsav(charbuffer);
              }
  
!             if(alternativeparser) {
!               /* We are parsing alternatives... */
  
!               if(preferedcontent(type) ) {
!                 /* ... this is a prefered type, we want to store
                     this [instead of the earlier one]. */
  #if 0
!                 struct body *next;
!                 printf("%s is more fun than the previous one\n",
!                        type);
! #endif
! #if 0
!                 /*
!                 ** Not sure why this free section is here.
!                 ** It is causing purify to barf with massive numbers of
!                 ** "FMR: Free memory reads". When I commented it out it
!                 ** cleared up the problem with no associated memory leaked
!                 ** or difference in output. It's history for now.
!                 */ 
!                 while(bp) {
!                   next=bp->next;
!                   if (bp->line) free(bp->line);
!                   if (bp) free(bp);
!                   bp=next;
!                 }
  #endif
!                 headp = NULL;
                }
                else {
                  /* ...and this type is not a prefered one. Thus, we
                   * shall ignore it completely! */
                  content = CONTENT_IGNORE;
                }
!             }
!             if(ignorecontent(type)) {
!               /* don't save this */
!               content = CONTENT_IGNORE;
!             }
              else if (textcontent(type) ||
                       (inlinehtml && !strcasecmp(type, "text/html"))) {
                /* text content or text/html follows.

            alternativeparser = TRUE;
            /* restart on a new list: */
            lp=bp=NULL;
- 	  /* clean the alternative status variables */
- 	  alternative_weight = -1;
- 	  alternative_lp = alternative_bp = NULL;
- 	  alternative_lastfile_created = NO_FILE;
- 	  alternative_file[0] = alternative_lastfile[0] = '\0';
          }
          headp = lp; /* start at this point next time */
        }
        else {
! 	bp = addbody(bp, &lp, line, BODY_HEADER|bodyflags);
        }
      }
      else {
--- 1368,1381 ----
            origlp=lp;
  
            alternativeparser = TRUE;
+ 
            /* restart on a new list: */
            lp=bp=NULL;
          }
          headp = lp; /* start at this point next time */
        }
        else {
!         bp = addbody(bp, &lp, line, BODY_HEADER|bodyflags);
        }
      }
      else {

                  file=strrchr(binname, PATH_SEPARATOR);
                  if (file)
                    file++; /* pass the separator */

!               if (!nameisuniq && binname) {
                  free(binname);
- 	      }
              }
            }

  #endif
--- 1733,1740 ----
                else
                  content = CONTENT_UNKNOWN;
                
!               if (!nameisuniq && binname)
                  free(binname);
              }
            }

  #endif Received on Thu 01 Jul 1999 07:31:46 PM GMT

This archive was generated by hypermail 2.2.0 : Thu 22 Feb 2007 07:33:51 PM GMT GMT