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

[PATCH 3/7] localedef: revert Ulrich's preprocessor that isn't enough for Debian



From: Pierre Habouzit <madcoder@debian.org>
Date: Mon, 29 Oct 2007 16:08:44 -0500

It loops endlessly when ifdef is used.

Signed-off-by: Jonathan Nieder <jrnieder@gmail.com>
---
 locale/programs/ld-collate.c |  265 ------------------------------------------
 1 files changed, 0 insertions(+), 265 deletions(-)

diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c
index a26da46..4f94b24 100644
--- a/locale/programs/ld-collate.c
+++ b/locale/programs/ld-collate.c
@@ -181,14 +181,6 @@ struct symbol_t
 #include "3level.h"
 
 
-/* Simple name list for the preprocessor.  */
-struct name_list
-{
-  struct name_list *next;
-  char str[0];
-};
-
-
 /* The real definition of the struct for the LC_COLLATE locale.  */
 struct locale_collate_t
 {
@@ -250,15 +242,6 @@ struct locale_collate_t
   /* The arrays with the collation sequence order.  */
   unsigned char mbseqorder[256];
   struct collseq_table wcseqorder;
-
-  /* State of the preprocessor.  */
-  enum
-    {
-      else_none = 0,
-      else_ignore,
-      else_seen
-    }
-    else_action;
 };
 
 
@@ -266,9 +249,6 @@ struct locale_collate_t
    LC_COLLATE category descriptions in all files.  */
 static uint32_t nrules;
 
-/* List of defined preprocessor symbols.  */
-static struct name_list *defined;
-
 
 /* We need UTF-8 encoding of numbers.  */
 static inline int
@@ -2655,46 +2635,6 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap,
 }
 
 
-static enum token_t
-skip_to (struct linereader *ldfile, struct locale_collate_t *collate,
-	 const struct charmap_t *charmap, int to_endif)
-{
-  while (1)
-    {
-      struct token *now = lr_token (ldfile, charmap, NULL, NULL, 0);
-      enum token_t nowtok = now->tok;
-
-      if (nowtok == tok_eof || nowtok == tok_end)
-	return nowtok;
-
-      if (nowtok == tok_ifdef || nowtok == tok_ifndef)
-	{
-	  lr_error (ldfile, _("%s: nested conditionals not supported"),
-		    "LC_COLLATE");
-	  nowtok = skip_to (ldfile, collate, charmap, tok_endif);
-	  if (nowtok == tok_eof || nowtok == tok_end)
-	    return nowtok;
-	}
-      else if (nowtok == tok_endif || (!to_endif && nowtok == tok_else))
-	{
-	  lr_ignore_rest (ldfile, 1);
-	  return nowtok;
-	}
-      else if (!to_endif && (nowtok == tok_elifdef || nowtok == tok_elifndef))
-	{
-	  /* Do not read the rest of the line.  */
-	  return nowtok;
-	}
-      else if (nowtok == tok_else)
-	{
-	  lr_error (ldfile, _("%s: more then one 'else'"), "LC_COLLATE");
-	}
-
-      lr_ignore_rest (ldfile, 0);
-    }
-}
-
-
 void
 collate_read (struct linereader *ldfile, struct localedef_t *result,
 	      const struct charmap_t *charmap, const char *repertoire_name,
@@ -2725,8 +2665,6 @@ collate_read (struct linereader *ldfile, struct localedef_t *result,
   /* The rest of the line containing `LC_COLLATE' must be free.  */
   lr_ignore_rest (ldfile, 1);
 
-  while (1)
-    {
       do
 	{
 	  now = lr_token (ldfile, charmap, result, NULL, verbose);
@@ -2734,31 +2672,6 @@ collate_read (struct linereader *ldfile, struct localedef_t *result,
 	}
       while (nowtok == tok_eol);
 
-      if (nowtok != tok_define)
-	break;
-
-      if (ignore_content)
-	lr_ignore_rest (ldfile, 0);
-      else
-	{
-	  arg = lr_token (ldfile, charmap, result, NULL, verbose);
-	  if (arg->tok != tok_ident)
-	    SYNTAX_ERROR (_("%s: syntax error"), "LC_COLLATE");
-	  else
-	    {
-	      /* Simply add the new symbol.  */
-	      struct name_list *newsym = xmalloc (sizeof (*newsym)
-						  + arg->val.str.lenmb + 1);
-	      memcpy (newsym->str, arg->val.str.startmb, arg->val.str.lenmb);
-	      newsym->str[arg->val.str.lenmb] = '\0';
-	      newsym->next = defined;
-	      defined = newsym;
-
-	      lr_ignore_rest (ldfile, 1);
-	    }
-	}
-    }
-
   if (nowtok == tok_copy)
     {
       now = lr_token (ldfile, charmap, result, NULL, verbose);
@@ -3914,7 +3827,6 @@ error while adding equivalent collating symbol"));
 	  break;
 
 	case tok_end:
-	seen_end:
 	  /* Next we assume `LC_COLLATE'.  */
 	  if (!ignore_content)
 	    {
@@ -3955,182 +3867,6 @@ error while adding equivalent collating symbol"));
 	  lr_ignore_rest (ldfile, arg->tok == tok_lc_collate);
 	  return;
 
-	case tok_define:
-	  if (ignore_content)
-	    {
-	      lr_ignore_rest (ldfile, 0);
-	      break;
-	    }
-
-	  arg = lr_token (ldfile, charmap, result, NULL, verbose);
-	  if (arg->tok != tok_ident)
-	    goto err_label;
-
-	  /* Simply add the new symbol.  */
-	  struct name_list *newsym = xmalloc (sizeof (*newsym)
-					      + arg->val.str.lenmb + 1);
-	  memcpy (newsym->str, arg->val.str.startmb, arg->val.str.lenmb);
-	  newsym->str[arg->val.str.lenmb] = '\0';
-	  newsym->next = defined;
-	  defined = newsym;
-
-	  lr_ignore_rest (ldfile, 1);
-	  break;
-
-	case tok_undef:
-	  if (ignore_content)
-	    {
-	      lr_ignore_rest (ldfile, 0);
-	      break;
-	    }
-
-	  arg = lr_token (ldfile, charmap, result, NULL, verbose);
-	  if (arg->tok != tok_ident)
-	    goto err_label;
-
-	  /* Remove _all_ occurrences of the symbol from the list.  */
-	  struct name_list *prevdef = NULL;
-	  struct name_list *curdef = defined;
-	  while (curdef != NULL)
-	    if (strncmp (arg->val.str.startmb, curdef->str,
-			 arg->val.str.lenmb) == 0
-		&& curdef->str[arg->val.str.lenmb] == '\0')
-	      {
-		if (prevdef == NULL)
-		  defined = curdef->next;
-		else
-		  prevdef->next = curdef->next;
-
-		struct name_list *olddef = curdef;
-		curdef = curdef->next;
-
-		free (olddef);
-	      }
-	    else
-	      {
-		prevdef = curdef;
-		curdef = curdef->next;
-	      }
-
-	  lr_ignore_rest (ldfile, 1);
-	  break;
-
-	case tok_ifdef:
-	case tok_ifndef:
-	  if (ignore_content)
-	    {
-	      lr_ignore_rest (ldfile, 0);
-	      break;
-	    }
-
-	found_ifdef:
-	  arg = lr_token (ldfile, charmap, result, NULL, verbose);
-	  if (arg->tok != tok_ident)
-	    goto err_label;
-	  lr_ignore_rest (ldfile, 1);
-
-	  if (collate->else_action == else_none)
-	    {
-	      curdef = defined;
-	      while (curdef != NULL)
-		if (strncmp (arg->val.str.startmb, curdef->str,
-			     arg->val.str.lenmb) == 0
-		    && curdef->str[arg->val.str.lenmb] == '\0')
-		  break;
-		else
-		  curdef = curdef->next;
-
-	      if ((nowtok == tok_ifdef && curdef != NULL)
-		  || (nowtok == tok_ifndef && curdef == NULL))
-		{
-		  /* We have to use the if-branch.  */
-		  collate->else_action = else_ignore;
-		}
-	      else
-		{
-		  /* We have to use the else-branch, if there is one.  */
-		  nowtok = skip_to (ldfile, collate, charmap, 0);
-		  if (nowtok == tok_else)
-		    collate->else_action = else_seen;
-		  else if (nowtok == tok_elifdef)
-		    {
-		      nowtok = tok_ifdef;
-		      goto found_ifdef;
-		    }
-		  else if (nowtok == tok_elifndef)
-		    {
-		      nowtok = tok_ifndef;
-		      goto found_ifdef;
-		    }
-		  else if (nowtok == tok_eof)
-		    goto seen_eof;
-		  else if (nowtok == tok_end)
-		    goto seen_end;
-		}
-	    }
-	  else
-	    {
-	      /* XXX Should it really become necessary to support nested
-		 preprocessor handling we will push the state here.  */
-	      lr_error (ldfile, _("%s: nested conditionals not supported"),
-			"LC_COLLATE");
-	      nowtok = skip_to (ldfile, collate, charmap, 1);
-	      if (nowtok == tok_eof)
-		goto seen_eof;
-	      else if (nowtok == tok_end)
-		goto seen_end;
-	    }
-	  break;
-
-	case tok_elifdef:
-	case tok_elifndef:
-	case tok_else:
-	  if (ignore_content)
-	    {
-	      lr_ignore_rest (ldfile, 0);
-	      break;
-	    }
-
-	  lr_ignore_rest (ldfile, 1);
-
-	  if (collate->else_action == else_ignore)
-	    {
-	      /* Ignore everything until the endif.  */
-	      nowtok = skip_to (ldfile, collate, charmap, 1);
-	      if (nowtok == tok_eof)
-		goto seen_eof;
-	      else if (nowtok == tok_end)
-		goto seen_end;
-	    }
-	  else
-	    {
-	      assert (collate->else_action == else_none);
-	      lr_error (ldfile, _("\
-%s: '%s' without matching 'ifdef' or 'ifndef'"), "LC_COLLATE",
-			nowtok == tok_else ? "else"
-			: nowtok == tok_elifdef ? "elifdef" : "elifndef");
-	    }
-	  break;
-
-	case tok_endif:
-	  if (ignore_content)
-	    {
-	      lr_ignore_rest (ldfile, 0);
-	      break;
-	    }
-
-	  lr_ignore_rest (ldfile, 1);
-
-	  if (collate->else_action != else_ignore
-	      && collate->else_action != else_seen)
-	    lr_error (ldfile, _("\
-%s: 'endif' without matching 'ifdef' or 'ifndef'"), "LC_COLLATE");
-
-	  /* XXX If we support nested preprocessor directives we pop
-	     the state here.  */
-	  collate->else_action = else_none;
-	  break;
-
 	default:
 	err_label:
 	  SYNTAX_ERROR (_("%s: syntax error"), "LC_COLLATE");
@@ -4141,7 +3877,6 @@ error while adding equivalent collating symbol"));
       nowtok = now->tok;
     }
 
- seen_eof:
   /* When we come here we reached the end of the file.  */
   lr_error (ldfile, _("%s: premature end of file"), "LC_COLLATE");
 }
-- 
1.7.5.1


Reply to: