--- libidu/scanners.c.orig	2010-12-11 15:27:10.000000000 -0800
+++ libidu/scanners.c	2010-12-11 15:26:59.000000000 -0800
@@ -1618,6 +1618,7 @@
   switch (c)
     {
     case EOF:
+    out:
       obstack_free (&tokens_obstack, obstack_finish (&tokens_obstack));
       return 0;
       
@@ -1634,19 +1635,25 @@
     case ';':				/* comment */
       do {
 	c = getc (in_FILE);
-      } while ( (c != EOF) && (c != '\n'));
+	if (c == EOF)
+	  goto out;
+      } while (c != '\n');
       goto top;
       
     case '"':				/* string with or without ansi-C escapes */
     string:
       do {
 	c = getc (in_FILE);
+        if (c == EOF)
+	  goto out;
 	if (c == '\\')
 	  {
 	    c = getc (in_FILE);
+            if (c == EOF)
+	      goto out;
 	    continue;
 	  }
-      } while ( (c != EOF) && (c != '"'));
+      } while (c != '"');
       goto top;
       
     case '.':
@@ -1654,11 +1661,12 @@
       id = scanner_buffer;
       *id++ = c;
       c = getc (in_FILE);
+      if (c == EOF)
+	goto out;
       if (is_DIGIT (c) ||
 	  (scanner_buffer[0] != '.' && (c == '.' || c == 'i' || c == 'I')))
 	goto number;
-      if (c != EOF)
-	ungetc (c, in_FILE);
+      ungetc (c, in_FILE);
       goto ident;
       
     case '#':
@@ -1667,20 +1675,23 @@
       
       c = getc (in_FILE);
       if (c == EOF)
-	goto top;
+	goto out;
       else if (is_RADIX (c))
 	goto number;
       else if (c == '\\')	/* #\... literal Character */
 	{
 	  *id++ = c;
 	  c = getc (in_FILE);
+          if (c == EOF)
+	    goto out;
 	  *id++ = c;
 	  if (is_LETTER (c))
 	    {
 	      while (is_LETTER (c = getc (in_FILE)))
 		*id++ = c;
-	      if (c != EOF)
-		ungetc (c, in_FILE);
+              if (c == EOF)
+	        goto out;
+	      ungetc (c, in_FILE);
 	    }
 	  *flags = TOK_LITERAL;
 	  obstack_grow0 (&tokens_obstack, scanner_buffer, id - scanner_buffer);
@@ -1694,8 +1705,9 @@
 	{
 	  while (is_LETTER (c = getc (in_FILE)))
 	    *id++ = c;
-	  if (c != EOF)
-	    ungetc (c, in_FILE);
+          if (c == EOF)
+	    goto out;
+	  ungetc (c, in_FILE);
 	  *flags = TOK_LITERAL;
 	  obstack_grow0 (&tokens_obstack, scanner_buffer, id - scanner_buffer);
 	  return (struct token *) obstack_finish (&tokens_obstack);
@@ -1712,13 +1724,17 @@
 		  break;
 	      }
 	  } while (c != EOF);
+          if (c == EOF)
+	    goto out;
 	  goto top;
 	}
       else if (c == '@')	/* #@LENGTH ...^_ EMACS byte-code comment */
 	{
 	  do {
 	    c = getc (in_FILE);
-	  } while ( (c != EOF) && (c != '\037'));
+            if (c == EOF)
+	      goto out;
+	  } while (c != '\037');
 	  goto top;
 	}
       else if (c == '[')	/* #[ ... ] EMACS byte-code object */
@@ -1742,23 +1758,24 @@
 	    {
 	      while (is_IDENT (c = getc (in_FILE)))
 		*id++ = c;
+              if (c == EOF)
+	        goto out;
 	      if (c == '[')
 		{
 		  c = getc (in_FILE);
+                  if (c == EOF)
+	            goto out;
 		  if (c == ']')
 		    {
 		      *id++ = '[';
 		      *id++ = ']';
 		      continue;
 		    }
-		  if (c != EOF)
-		    ungetc (c, in_FILE);
-		  ungetc ('[', in_FILE);
+		  ungetc (c, in_FILE);
 		}
 	      break;
 	    }
-	  if (c != EOF)
-	    ungetc (c, in_FILE);
+	  ungetc (c, in_FILE);
 	  *flags = TOK_NAME | TOK_LITERAL;
 	  obstack_grow0 (&tokens_obstack, scanner_buffer, id - scanner_buffer);
 	  return (struct token *) obstack_finish (&tokens_obstack);
@@ -1770,8 +1787,9 @@
 	  *id++ = c;
 	  while (is_NUMBER (c = getc (in_FILE)))
 	    *id++ = c;
-	  if (c != EOF)
-	    ungetc (c, in_FILE);
+          if (c == EOF)
+	    goto out;
+	  ungetc (c, in_FILE);
 	  *flags = TOK_NUMBER | TOK_LITERAL;
 	  obstack_grow0 (&tokens_obstack, scanner_buffer, id - scanner_buffer);
 	  return (struct token *) obstack_finish (&tokens_obstack);
