Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Delete output files if this is a failed run.
Otherwise, the fail will stop a Makefile from progressing, but if you immediately run the build again, Make will think the output files are up to date, since they are newer (albeit incomplete/incorrect). |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | lemon-update-2010 |
Files: | files | file ages | folders |
SHA1: |
e38c08d9cdeb0476ac1a77cd3f29f547 |
User & Date: | icculus 2010-02-14 05:34:43.000 |
Context
2010-02-14
| ||
05:42 |
Added option to not clip error output.
This is useful for IDEs and other tools that benefit from full path information, so they can jump directly to the error line in the source code. (check-in: 90602030d1 user: icculus tags: lemon-update-2010) | |
05:34 |
Delete output files if this is a failed run.
Otherwise, the fail will stop a Makefile from progressing, but if you immediately run the build again, Make will think the output files are up to date, since they are newer (albeit incomplete/incorrect). (check-in: e38c08d9cd user: icculus tags: lemon-update-2010) | |
05:19 |
Added %expect directive, to consider a certain number of conflicts "correct."
This has the side effect of changing the process exit code to never overflow. (check-in: d8bab8cf0b user: icculus tags: lemon-update-2010) | |
Changes
Changes to tool/lemon.c.
︙ | |||
29 30 31 32 33 34 35 36 37 38 39 40 41 42 | 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | + + + + + + + + + + + + + + + + + + | #define PRIVATE #ifdef TEST #define MAXRHS 5 /* Set low to exercise exception code */ #else #define MAXRHS 1000 #endif static const char **made_files = NULL; static int made_files_count = 0; static int successful_exit = 0; static void LemonAtExit(void) { /* if we failed, delete (most) files we made, to unconfuse build tools. */ int i; for (i = 0; i < made_files_count; i++) { if (!successful_exit) { remove(made_files[i]); } free((void *) made_files[i]); } free(made_files); made_files_count = 0; made_files = NULL; } static char *msort(char*,char**,int(*)(const char*,const char*)); /* ** Compilers are getting increasingly pedantic about type conversions ** as C evolves ever closer to Ada.... To work around the latest problems ** we have to define the following variant of strlen(). |
︙ | |||
1465 1466 1467 1468 1469 1470 1471 1472 1473 1474 1475 1476 1477 1478 | 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 | + + | "Print parser stats to standard output."}, {OPT_FLAG, "x", (char*)&version, "Print the version number."}, {OPT_FLAG,0,0,0} }; int i; int exitcode; struct lemon lem; atexit(LemonAtExit); OptInit(argv,options,stderr); if( version ){ printf("Lemon version 1.0\n"); exit(0); } if( OptNArgs()!=1 ){ |
︙ | |||
1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 | 1592 1593 1594 1595 1596 1597 1598 1599 1600 1601 1602 1603 1604 1605 1606 | + | } if( lem.nconflict != lem.nexpected ){ fprintf(stderr,"%d parsing conflicts (%d expected).\n",lem.nconflict,lem.nexpected); } /* return 0 on success, 1 on failure. */ exitcode = ((lem.errorcnt > 0) || (lem.nconflict != lem.nexpected)) ? 1 : 0; successful_exit = (exitcode == 0); exit(exitcode); return (exitcode); } /******************** From the file "msort.c" *******************************/ /* ** A generic merge-sort program. ** |
︙ | |||
2827 2828 2829 2830 2831 2832 2833 2834 2835 2836 2837 2838 2839 2840 | 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873 2874 2875 2876 2877 2878 2879 | + + + + + + + + + + + + + + + + + + | lemp->outname = file_makename(lemp, suffix); fp = fopen(lemp->outname,mode); if( fp==0 && *mode=='w' ){ fprintf(stderr,"Can't open file \"%s\".\n",lemp->outname); lemp->errorcnt++; return 0; } /* Add files we create to a list, so we can delete them if we fail. This ** is to keep makefiles from getting confused. We don't include .out files, ** though: this is debug information, and you don't want it deleted if there ** was an error you need to track down. */ if(( *mode=='w' ) && (strcmp(suffix, ".out") != 0)){ const char **ptr = (const char **) realloc(made_files, sizeof (const char **) * (made_files_count + 1)); char *fname = strdup(lemp->outname); if ((ptr == NULL) || (fname == NULL)) { free(ptr); free(fname); memory_error(); } made_files = ptr; made_files[made_files_count++] = fname; } return fp; } /* Duplicate the input file without comments and without actions ** on rules */ void Reprint(lemp) struct lemon *lemp; |
︙ |