1
0
mirror of git://projects.qi-hardware.com/cae-tools.git synced 2024-12-23 09:55:32 +02:00

cameo: added command "append", improved file output error checking

- README: added description of "append"
- lang.l, lang.y: added command "append"
- gnuplot.h, gnuplot.c (gnuplot_append): append gnuplot paths to an
  existing file
- gnuplot.c (gnuplot_do_write): if writing to standard output, at least
  check that fflush() works at the end
This commit is contained in:
Werner Almesberger 2010-12-15 06:27:15 -03:00
parent 7a64e425da
commit b8f6545821
4 changed files with 47 additions and 3 deletions

View File

@ -45,10 +45,13 @@ translation.
File output: File output:
write [<filename>] write [<filename>]
append [<filenname>]
Writes all loaded paths in gnuplot format to the specified file. If the Writes all loaded paths in gnuplot format to the specified file. If the
file name is omitted, "write" writes to standard output. file name is omitted, "write" writes to standard output.
"append" is like "write", except that it appends to an existing file.
File names can contain spaces and any printable characters, but no leading File names can contain spaces and any printable characters, but no leading
or trailing spaces. It is not possible to place a comment after a file or trailing spaces. It is not possible to place a comment after a file
name or at a place where a file name could be. name or at a place where a file name could be.

View File

@ -14,6 +14,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <sys/stat.h>
#include "path.h" #include "path.h"
#include "gnuplot.h" #include "gnuplot.h"
@ -99,8 +100,13 @@ static int gnuplot_do_write(FILE *file, const struct path *paths)
if (fprintf(file, "%f %f %f\n", p->x, p->y, p->z) < 0) if (fprintf(file, "%f %f %f\n", p->x, p->y, p->z) < 0)
return 0; return 0;
} }
if (file != stdout && fclose(file) < 0) if (file == stdout) {
if (fflush(file) == EOF)
return 0; return 0;
} else {
if (fclose(file) < 0)
return 0;
}
return 1; return 1;
} }
@ -120,3 +126,30 @@ void gnuplot_write(const char *name, const struct path *paths)
} }
} }
void gnuplot_append(const char *name, const struct path *paths)
{
FILE *file;
struct stat st;
if (!name) {
printf("\n");
gnuplot_write(NULL, paths);
return;
}
file = fopen(name, "a");
if (!file) {
perror(name);
exit(1);
}
if (stat(name, &st) < 0) {
perror("lstat");
exit(1);
}
if (!S_ISREG(st.st_mode) || st.st_size)
fprintf(file, "\n");
if (!gnuplot_do_write(file, paths)) {
perror(name);
exit(1);
}
}

View File

@ -51,6 +51,8 @@ NUM -?[0-9]+\.?[0-9]*
<INITIAL>translate return TOK_TRANSLATE; <INITIAL>translate return TOK_TRANSLATE;
<INITIAL>z return TOK_Z; <INITIAL>z return TOK_Z;
<INITIAL>append { BEGIN(FILENAME);
return TOK_APPEND; }
<INITIAL>gerber { file_name_follows = 1; <INITIAL>gerber { file_name_follows = 1;
return TOK_GERBER; } return TOK_GERBER; }
<INITIAL>gnuplot { file_name_follows = 1; <INITIAL>gnuplot { file_name_follows = 1;

View File

@ -152,7 +152,7 @@ static struct path **classify(struct path **anchor, struct path *path)
%token TOK_ALIGN TOK_ARRAY TOK_CLEAR TOK_DRILL TOK_EMPTY %token TOK_ALIGN TOK_ARRAY TOK_CLEAR TOK_DRILL TOK_EMPTY
%token TOK_MILL TOK_OFFSET TOK_REMAINDER TOK_RESET %token TOK_MILL TOK_OFFSET TOK_REMAINDER TOK_RESET
%token TOK_TRANSLATE TOK_Z %token TOK_TRANSLATE TOK_Z
%token TOK_GERBER TOK_GNUPLOT TOK_EXCELLON TOK_WRITE %token TOK_APPEND TOK_GERBER TOK_GNUPLOT TOK_EXCELLON TOK_WRITE
%token TOK_DOG TOK_INSIDE %token TOK_DOG TOK_INSIDE
%token <num> NUM_EXP_MIL NUM_EXP_MM NUM_IMP_MIL NUM_IMP_MM REF %token <num> NUM_EXP_MIL NUM_EXP_MM NUM_IMP_MIL NUM_IMP_MM REF
@ -241,6 +241,12 @@ command:
gnuplot_write($2, paths); gnuplot_write($2, paths);
translate(0, 0, -zo); translate(0, 0, -zo);
} }
| TOK_APPEND opt_filename
{
translate(0, 0, zo);
gnuplot_append($2, paths);
translate(0, 0, -zo);
}
| TOK_DRILL dimen dimen | TOK_DRILL dimen dimen
{ {
struct path **walk; struct path **walk;