# make ddd exit with code 1 if something goes wrong, especially the test suite

--- a/ddd/ddd.cpp
+++ b/ddd/ddd.cpp
@@ -151,6 +151,7 @@ int main(int argc, char *argv[])
   unsigned int genseed=0;
   FILE *fp;
   cTimer timer;
+  int success = true;
 
   struct deal dl;
   struct futureTricks fut;
@@ -282,19 +283,19 @@ int main(int argc, char *argv[])
   }
 
   if(gen > 0)
-  { generate(gen,genseed,gencards,gentricks);
+  { success = generate(gen,genseed,gencards,gentricks);
     goto cleanup;
   }
   if(btimeall)
-  { timeAll(pszfile,trumps,leader);
+  { success = timeAll(pszfile,trumps,leader);
     goto cleanup;
   }
   else if(pszxcn)
-  { timeg(pszfile,-1,1,1,pszxcn,(leader==-1?0:leader),bverbose);
+  { success = timeg(pszfile,-1,1,1,pszxcn,(leader==-1?0:leader),bverbose);
     goto cleanup;
   }
   else if(pszgiblib)
-  { giblib(pszfile,-1,1,1,pszgiblib);
+  { success = giblib(pszfile,-1,1,1,pszgiblib);
     goto cleanup;
   }
 
@@ -312,7 +313,7 @@ int main(int argc, char *argv[])
   }
 
   if(btricks)
-  { tricks(&gib,deal,-1,1,1);
+  { success = tricks(&gib,deal,-1,1,1);
     goto cleanup;
   }
 
@@ -330,7 +331,7 @@ int main(int argc, char *argv[])
   }
 
   // set up dds10
-  if(setDDS(&gib,&dl) == false)
+  if(success = setDDS(&gib,&dl) == false)
     return -1;
 
   printf("\n");
@@ -352,7 +353,7 @@ int main(int argc, char *argv[])
   cleanup:
   cleanSB();
 
-  return 0;
+  return !success;
 
 } // main
 // *****************************************************************************
@@ -757,8 +758,11 @@ bool giblib(char *pszfile, int target, i
          pszgiblib,format64(totalnodes,sz1),
          ntotal?format64(totalnodes/ntotal,sz2):format64(totalnodes,sz2),
          totalelapsed,ntotal?totalelapsed/(double)ntotal:totalelapsed);
-  if(nerror)
+  if(nerror) 
+  {
     printf("*** ERROR: nerror=%d, tricks and score different\n",nerror);
+    return false;
+  }
   printf("\n");
 
   fclose(fp);
