diff --git a/src/cpp.c b/src/cpp.c
index c644dbea268d741731b8becd529adbdb36614594..b932e38ed56aa4d996ab0513c3e083c4007e397f 100644
--- a/src/cpp.c
+++ b/src/cpp.c
@@ -645,7 +645,27 @@ static INT32 low_cpp(struct cpp *this,
 	      {
 		PUSH_STRING(a,l,&tmp);
 	      }else{
-		low_my_binary_strcat(a, l, &tmp);
+		if(DEF_ARG_NOPRESPACE)
+		  while(l && isspace(*(unsigned char *)a))
+		    a++,l--;
+		
+		if(DEF_ARG_NOPOSTSPACE)
+		  while(l && isspace(*(unsigned char *)(a+l-1)))
+		    l--;
+
+		if(d->parts[e].argument & (DEF_ARG_NOPRESPACE | DEF_ARG_NOPOSTSPACE))
+		{
+		  
+		  low_my_binary_strcat(a, l, &tmp);
+		}else{
+		  dynamic_buffer save;
+		  save=this->buf;
+		  this->buf=tmp;
+		  low_cpp(this, a, l,
+			  flags & ~(CPP_EXPECT_ENDIF | CPP_EXPECT_ELSE));
+		  tmp=this->buf;
+		  this->buf=save;
+		}
 	      }
 	      
 	      if(!(d->parts[e].argument & DEF_ARG_NOPOSTSPACE))
@@ -1136,11 +1156,19 @@ static INT32 low_cpp(struct cpp *this,
 		extra=DEF_ARG_NOPRESPACE;
 		while(str.s.len && isspace(str.s.str[str.s.len-1]))
 		  str.s.len--;
+		if(!str.s.len && sp-partbase>1)
+		{
+#ifdef DEBUG
+		  if(sp[-1].type != T_INT)
+		    fatal("Internal error in CPP\n");
+#endif
+		  sp[-1].u.integer|=DEF_ARG_NOPOSTSPACE;
+		}
 	      }else{
 		extra=DEF_ARG_STRINGIFY;
 	      }
 	      SKIPSPACE();
-	      
+	      pos++;
 	      /* fall through */
 	      
 	    default:
@@ -1799,11 +1827,11 @@ static void dumpdef(struct cpp *this,
 	  low_my_putchar('#',tmp);
 	
 	sprintf(buffer,"%ld",(long)(d->parts[e].argument & DEF_ARG_MASK));
+	low_my_binary_strcat(buffer,strlen(buffer), tmp);
 	
 	if(!(d->parts[e].argument & DEF_ARG_NOPOSTSPACE))
 	  low_my_putchar(' ',tmp);
 	
-	low_my_binary_strcat(buffer,strlen(buffer), tmp);
 	PUSH_STRING(d->parts[e].postfix->str, d->parts[e].postfix->len, tmp);
       } 
     }