diff --git a/Common/Context.cpp b/Common/Context.cpp index 023b6080a9a00f708db7e3811b5e3bcef147c09f..742f498851c535f74fa58ba0d4ae7dedc41c5acb 100644 --- a/Common/Context.cpp +++ b/Common/Context.cpp @@ -1,4 +1,4 @@ -/* $Id: Context.cpp,v 1.13 2000-12-06 18:28:30 remacle Exp $ */ +/* $Id: Context.cpp,v 1.14 2000-12-06 22:09:53 geuzaine Exp $ */ #include "Gmsh.h" #include "Const.h" @@ -37,6 +37,15 @@ extern StringXColor PrintOptions_Color[] ; // STRING OPTIONS +StringXString * Get_StringOptionCategory(char * cat){ + if (!strcmp(cat,"General")) return GeneralOptions_String ; + else if(!strcmp(cat,"Geometry")) return GeometryOptions_String ; + else if(!strcmp(cat,"Mesh")) return MeshOptions_String ; + else if(!strcmp(cat,"PostProcessing")) return PostProcessingOptions_String ; + else if(!strcmp(cat,"Print")) return PrintOptions_String ; + else return NULL ; +} + void Set_DefaultStringOptions(StringXString s[]){ int i = 0; while(s[i].str){ @@ -45,32 +54,36 @@ void Set_DefaultStringOptions(StringXString s[]){ } } -int Set_StringOption(char *str, StringXString s[], char *val){ - int i = 0 ; - +char ** Get_StringOption(char *str, StringXString s[]){ + int i = 0; while ((s[i].str != NULL) && (strcmp(s[i].str, str))) i++ ; if(!s[i].str) - return 0; - else{ - *s[i].ptr = val ; - return 1; - } + return NULL; + else + return s[i].ptr; } -void Print_StringOptions(StringXString s[], FILE *file){ +void Print_StringOptions(StringXString s[], char *prefix, FILE *file){ int i = 0; - while(s[i].str){ - fprintf(file, " %s = \"%s\";\n", s[i].str, *s[i].ptr) ; + fprintf(file, "%s%s = \"%s\";\n", prefix, s[i].str, *s[i].ptr) ; i++; } } // NUMBER OPTIONS +StringXNumber * Get_NumberOptionCategory(char * cat){ + if (!strcmp(cat,"General")) return GeneralOptions_Number ; + else if(!strcmp(cat,"Geometry")) return GeometryOptions_Number ; + else if(!strcmp(cat,"Mesh")) return MeshOptions_Number ; + else if(!strcmp(cat,"PostProcessing")) return PostProcessingOptions_Number ; + else if(!strcmp(cat,"Print")) return PrintOptions_Number ; + else return NULL ; +} + void Set_DefaultNumberOptions(StringXNumber s[]){ int i = 0; - while(s[i].str){ switch(s[i].type){ case GMSH_INT: *(int*)s[i].ptr = (int)s[i].def; break; @@ -82,32 +95,27 @@ void Set_DefaultNumberOptions(StringXNumber s[]){ } } -int Set_NumberOption(char *str, StringXNumber s[], double val){ +void * Get_NumberOption(char *str, StringXNumber s[], int *type){ int i = 0; while ((s[i].str != NULL) && (strcmp(s[i].str, str))) i++ ; if(!s[i].str) - return 0; + return NULL; else{ - switch(s[i].type){ - case GMSH_INT: *(int*)s[i].ptr = (int)val; break; - case GMSH_LONG: *(long*)s[i].ptr = (long)val; break; - case GMSH_FLOAT: *(float*)s[i].ptr = (float)val; break; - case GMSH_DOUBLE: *(double*)s[i].ptr = (double)val; break; - } - return 1; + *type = s[i].type ; + return s[i].ptr; } } -void Print_NumberOptions(StringXNumber s[], FILE *file){ +void Print_NumberOptions(StringXNumber s[], char *prefix, FILE *file){ int i = 0; - while(s[i].str){ + fprintf(file, "%s%s = ", prefix, s[i].str); switch(s[i].type){ - case GMSH_INT : fprintf(file, " %s = %d;\n", s[i].str, *(int*)s[i].ptr); break; - case GMSH_LONG : fprintf(file, " %s = %ld;\n", s[i].str, *(long*)s[i].ptr); break; - case GMSH_FLOAT : fprintf(file, " %s = %g;\n", s[i].str, *(float*)s[i].ptr); break; - case GMSH_DOUBLE : fprintf(file, " %s = %g;\n", s[i].str, *(double*)s[i].ptr); break; + case GMSH_INT : fprintf(file, "%d;\n", *(int*)s[i].ptr); break; + case GMSH_LONG : fprintf(file, "%ld;\n", *(long*)s[i].ptr); break; + case GMSH_FLOAT : fprintf(file, "%g;\n", *(float*)s[i].ptr); break; + case GMSH_DOUBLE : fprintf(file, "%g;\n", *(double*)s[i].ptr); break; } i++; } @@ -116,6 +124,15 @@ void Print_NumberOptions(StringXNumber s[], FILE *file){ // ARRAY OPTIONS +StringXArray * Get_ArrayOptionCategory(char * cat){ + if (!strcmp(cat,"General")) return GeneralOptions_Array ; + else if(!strcmp(cat,"Geometry")) return GeometryOptions_Array ; + else if(!strcmp(cat,"Mesh")) return MeshOptions_Array ; + else if(!strcmp(cat,"PostProcessing")) return PostProcessingOptions_Array ; + else if(!strcmp(cat,"Print")) return PrintOptions_Array ; + else return NULL ; +} + void Set_DefaultArrayOptions(StringXArray s[]){ int i = 0; @@ -150,48 +167,21 @@ void Set_DefaultArrayOptions(StringXArray s[]){ } } -int Set_ArrayOption(char *str, StringXArray s[], double *val){ +void * Get_ArrayOption(char *str, StringXArray s[], int *type){ int i = 0; - while ((s[i].str != NULL) && (strcmp(s[i].str, str))) i++ ; if(!s[i].str) - return 0; + return NULL; else{ - switch(s[i].type){ - case GMSH_INT: - ((int*)s[i].ptr)[0] = (int)val[0]; - ((int*)s[i].ptr)[1] = (int)val[1]; - ((int*)s[i].ptr)[2] = (int)val[2]; - ((int*)s[i].ptr)[3] = (int)val[3]; - break; - case GMSH_LONG: - ((long*)s[i].ptr)[0] = (long)val[0]; - ((long*)s[i].ptr)[1] = (long)val[1]; - ((long*)s[i].ptr)[2] = (long)val[2]; - ((long*)s[i].ptr)[3] = (long)val[3]; - break; - case GMSH_FLOAT: - ((float*)s[i].ptr)[0] = (float)val[0]; - ((float*)s[i].ptr)[1] = (float)val[1]; - ((float*)s[i].ptr)[2] = (float)val[2]; - ((float*)s[i].ptr)[3] = (float)val[3]; - break; - case GMSH_DOUBLE: - ((double*)s[i].ptr)[0] = (double)val[0]; - ((double*)s[i].ptr)[1] = (double)val[1]; - ((double*)s[i].ptr)[2] = (double)val[2]; - ((double*)s[i].ptr)[3] = (double)val[3]; - break; - } - return 1; + *type = s[i].type ; + return s[i].ptr; } } -void Print_ArrayOptions(StringXArray s[], FILE *file){ +void Print_ArrayOptions(StringXArray s[], char *prefix, FILE *file){ int i = 0; - while(s[i].str){ - fprintf(file, " %s = {", s[i].str); + fprintf(file, "%s%s = {", prefix, s[i].str); switch(s[i].type){ case GMSH_INT : fprintf(file, "%d,%d,%d,%d};\n", @@ -221,9 +211,17 @@ void Print_ArrayOptions(StringXArray s[], FILE *file){ // COLORS +StringXColor * Get_ColorOptionCategory(char * cat){ + if (!strcmp(cat,"General")) return GeneralOptions_Color ; + else if(!strcmp(cat,"Geometry")) return GeometryOptions_Color ; + else if(!strcmp(cat,"Mesh")) return MeshOptions_Color ; + else if(!strcmp(cat,"PostProcessing")) return PostProcessingOptions_Color ; + else if(!strcmp(cat,"Print")) return PrintOptions_Color ; + else return NULL ; +} + void Set_DefaultColorOptions(StringXColor s[], int num){ int i = 0; - while(s[i].str){ switch(num){ case 0 : *s[i].ptr = s[i].def1; break; @@ -234,31 +232,25 @@ void Set_DefaultColorOptions(StringXColor s[], int num){ } } -int Set_ColorOption(char *str, StringXColor s[], unsigned int val) { - int i = 0 ; - +unsigned int * Get_ColorOption(char *str, StringXColor s[]) { + int i = 0; while ((s[i].str != NULL) && (strcmp(s[i].str, str))) i++ ; if(!s[i].str) - return 0; - else{ - *s[i].ptr = val ; - return 1; - } + return NULL; + else + return s[i].ptr; } -void Print_ColorOptions(StringXColor s[], FILE *file){ +void Print_ColorOptions(StringXColor s[], char *prefix, FILE *file){ int i = 0; - - fprintf(file, " Color {\n"); while(s[i].str){ - fprintf(file, " %s = {%d,%d,%d};\n", - s[i].str, + fprintf(file, "%sColor.%s = {%d,%d,%d};\n", + prefix, s[i].str, UNPACK_RED(*s[i].ptr), UNPACK_GREEN(*s[i].ptr), UNPACK_BLUE(*s[i].ptr)); i++; } - fprintf(file, " }\n"); } int Get_ColorForString(StringX4Int SX4I[], int alpha, @@ -350,43 +342,32 @@ void Init_Context(void){ void Print_Context(FILE *file){ - fprintf(file, "Options{\n"); - - fprintf(file, " General{\n"); - Print_StringOptions(GeneralOptions_String, file); - Print_NumberOptions(GeneralOptions_Number, file); - Print_ArrayOptions(GeneralOptions_Array, file); - Print_ColorOptions(GeneralOptions_Color, file); - fprintf(file, " }\n"); - - fprintf(file, " Geometry{\n"); - Print_StringOptions(GeometryOptions_String, file); - Print_NumberOptions(GeometryOptions_Number, file); - Print_ArrayOptions(GeometryOptions_Array, file); - Print_ColorOptions(GeometryOptions_Color, file); - fprintf(file, " }\n"); - - fprintf(file, " Mesh{\n"); - Print_StringOptions(MeshOptions_String, file); - Print_NumberOptions(MeshOptions_Number, file); - Print_ArrayOptions(MeshOptions_Array, file); - Print_ColorOptions(MeshOptions_Color, file); - fprintf(file, " }\n"); - - fprintf(file, " PostProcessing{\n"); - Print_StringOptions(PostProcessingOptions_String, file); - Print_NumberOptions(PostProcessingOptions_Number, file); - Print_ArrayOptions(PostProcessingOptions_Array, file); - Print_ColorOptions(PostProcessingOptions_Color, file); - fprintf(file, " }\n"); - - fprintf(file, " Print{\n"); - Print_StringOptions(PrintOptions_String, file); - Print_NumberOptions(PrintOptions_Number, file); - Print_ArrayOptions(PrintOptions_Array, file); - Print_ColorOptions(PrintOptions_Color, file); - fprintf(file, " }\n"); - + fprintf(file, "Options{\n\n"); + Print_StringOptions(GeneralOptions_String, " General.", file); + Print_NumberOptions(GeneralOptions_Number, " General.", file); + Print_ArrayOptions(GeneralOptions_Array, " General.", file); + Print_ColorOptions(GeneralOptions_Color, " General.", file); + fprintf(file, " \n"); + Print_StringOptions(GeometryOptions_String, " Geometry.", file); + Print_NumberOptions(GeometryOptions_Number, " Geometry.", file); + Print_ArrayOptions(GeometryOptions_Array, " Geometry.", file); + Print_ColorOptions(GeometryOptions_Color, " Geometry.", file); + fprintf(file, " \n"); + Print_StringOptions(MeshOptions_String, " Mesh.", file); + Print_NumberOptions(MeshOptions_Number, " Mesh.", file); + Print_ArrayOptions(MeshOptions_Array, " Mesh.", file); + Print_ColorOptions(MeshOptions_Color, " Mesh.", file); + fprintf(file, " \n"); + Print_StringOptions(PostProcessingOptions_String, " PostProcessing.", file); + Print_NumberOptions(PostProcessingOptions_Number, " PostProcessing.", file); + Print_ArrayOptions(PostProcessingOptions_Array, " PostProcessing.", file); + Print_ColorOptions(PostProcessingOptions_Color, " PostProcessing.", file); + fprintf(file, " \n"); + Print_StringOptions(PrintOptions_String, " Print.", file); + Print_NumberOptions(PrintOptions_Number, " Print.", file); + Print_ArrayOptions(PrintOptions_Array, " Print.", file); + Print_ColorOptions(PrintOptions_Color, " Print.", file); + fprintf(file, " \n"); fprintf(file, "}\n"); } diff --git a/Common/Context.h b/Common/Context.h index 90b35a1e1cfb06f27c23a747e3b064414179ec3e..fab8a22ccc0a58a82a54ee17432f32287f8caca4 100644 --- a/Common/Context.h +++ b/Common/Context.h @@ -1,4 +1,4 @@ -/* $Id: Context.h,v 1.15 2000-12-06 18:28:30 remacle Exp $ */ +/* $Id: Context.h,v 1.16 2000-12-06 22:09:53 geuzaine Exp $ */ #ifndef _CONTEXT_H_ #define _CONTEXT_H_ @@ -180,21 +180,25 @@ typedef struct { unsigned int def1, def2, def3 ; } StringXColor ; +StringXString * Get_StringOptionCategory(char * cat); +StringXNumber * Get_NumberOptionCategory(char * cat); +StringXArray * Get_ArrayOptionCategory(char * cat); +StringXColor * Get_ColorOptionCategory(char * cat); void Set_DefaultStringOptions(StringXString s[]); void Set_DefaultNumberOptions(StringXNumber s[]); void Set_DefaultArrayOptions(StringXArray s[]); void Set_DefaultColorOptions(StringXColor s[], int num); -int Set_StringOption(char *str, StringXString s[], char *val); -int Set_NumberOption(char *str, StringXNumber s[], double val); -int Set_ArrayOption(char *str, StringXArray s[], double *val); -int Set_ColorOption(char *str, StringXColor s[], unsigned int val); +char ** Get_StringOption(char *str, StringXString s[]); +void * Get_NumberOption(char *str, StringXNumber s[], int *type); +void * Get_ArrayOption(char *str, StringXArray s[], int *type); +unsigned int * Get_ColorOption(char *str, StringXColor s[]); -void Print_StringOptions(StringXString s[], FILE *file); -void Print_NumberOptions(StringXNumber s[], FILE *file); -void Print_ArrayOptions(StringXArray s[], FILE *file); -void Print_ColorOptions(StringXArray s[], FILE *file); +void Print_StringOptions(StringXString s[], char *prefix, FILE *file); +void Print_NumberOptions(StringXNumber s[], char *prefix, FILE *file); +void Print_ArrayOptions(StringXArray s[], char *prefix, FILE *file); +void Print_ColorOptions(StringXArray s[], char *prefix, FILE *file); void Init_Colors (int num); void Init_Context (void); diff --git a/Parser/Gmsh.l b/Parser/Gmsh.l index 43f24a5e775dba3d50cf6c80ca33d3856ae5d790..b23a7fe3ee6015555af2bd76b70e8db626ebfe40 100644 --- a/Parser/Gmsh.l +++ b/Parser/Gmsh.l @@ -1,4 +1,4 @@ -%{ /* $Id: Gmsh.l,v 1.8 2000-12-06 18:28:30 remacle Exp $ */ +%{ /* $Id: Gmsh.l,v 1.9 2000-12-06 22:09:53 geuzaine Exp $ */ #include <stdio.h> #include <stdlib.h> @@ -69,8 +69,22 @@ stepid {dieze}({digit})* "newreg" {yylval.d = NEWREG(); return tDOUBLE;} "newp" {yylval.d = NEWPOINT(); return tDOUBLE;} "=" return tAFFECT; +"+=" return tAFFECTPLUS ; +"-=" return tAFFECTMINUS ; +"*=" return tAFFECTTIMES ; +"/=" return tAFFECTDIVIDE ; "..." return tDOTS; - +":" return tDOTS ; +"/\\" return tCROSSPRODUCT ; +"||" return tOR ; +"&&" return tAND ; +"++" return tPLUSPLUS ; +"--" return tMINUSMINUS ; +"==" return tEQUAL ; +"!=" return tNOTEQUAL ; +"~=" return tAPPROXEQUAL ; +"<=" return tLESSOREQUAL ; +">=" return tGREATEROREQUAL ; ACos return tAcos ; ArcCos return tAcos ; @@ -80,7 +94,6 @@ Atan return tAtan ; ArcTan return tAtan ; Atan2 return tAtan2 ; ArcTan2 return tAtan2 ; -Association return tAssociation; Attractor return tAttractor; Bump return tBump; @@ -111,9 +124,6 @@ Fabs return tFabs ; Floor return tFloor ; Fmod return tFmod ; -General return tGeneral; -Geometry return tGeometry; - Hypot return tHypot ; Include return tInclude; @@ -127,7 +137,6 @@ Log return tLog ; Log10 return tLog10 ; Layers return tLayers; -Mesh return tMesh; Modulo return tModulo ; Nurbs return tNurbs; @@ -143,8 +152,7 @@ Point return tPoint; Power return tProgression; Progression return tProgression; Parametric return tParametric; -PostProcessing return tPostProcessing; -Print return tPrint; +Printf return tPrintf ; Recombine return tRecombine; Rotate return tRotate; @@ -157,6 +165,7 @@ Save return tPhysical; Spline return tSpline; Surface return tSurface; Symmetry return tSymmetry; +Script return tScript; Transfinite return tTransfinite; Translate return tTranslate; diff --git a/Parser/Gmsh.y b/Parser/Gmsh.y index ffbc28977ba7699e46dcd37db331da418b9c79a0..a229412caede0c7879f8d8a6ead09f891ad1965b 100644 --- a/Parser/Gmsh.y +++ b/Parser/Gmsh.y @@ -1,4 +1,4 @@ -%{ /* $Id: Gmsh.y,v 1.16 2000-12-06 18:28:30 remacle Exp $ */ +%{ /* $Id: Gmsh.y,v 1.17 2000-12-06 22:09:53 geuzaine Exp $ */ #include <stdarg.h> @@ -40,17 +40,26 @@ static Shape TheShape; static int i,j,k,flag,RecursionLevel=0,ImbricatedLoop = 0; static double d; static ExtrudeParams extr; -static StringXColor *ColorField ; static List_T *ListOfDouble_L,*ListOfDouble2_L; static List_T *ListOfListOfDouble_L; +static void *pNumOpt, *pArrOpt; +static char **pStrOpt; +static unsigned int *pColOpt; +static StringXString *pStrCat; +static StringXNumber *pNumCat; +static StringXArray *pArrCat; +static StringXColor *pColCat; + void yyerror (char *s); void vyyerror (char *fmt, ...); + %} %union { char *c; int i; + unsigned int u; double d; double v[5]; Shape s; @@ -63,11 +72,11 @@ void vyyerror (char *fmt, ...); %token tEND tAFFECT tDOTS tPi %token tExp tLog tLog10 tSqrt tSin tAsin tCos tAcos tTan %token tAtan tAtan2 tSinh tCosh tTanh tFabs tFloor tCeil -%token tFmod tModulo tHypot +%token tFmod tModulo tHypot tPrintf %token tPoint tCircle tEllipsis tLine tSurface tSpline tVolume %token tCharacteristic tLength tParametric tElliptic %token tPlane tRuled tTransfinite tComplex tPhysical -%token tUsing tPower tBump tProgression tAssociation +%token tUsing tBump tProgression %token tRotate tTranslate tSymmetry tDilate tExtrude tDuplicata %token tLoop tInclude tRecombine tDelete tCoherence %token tView tOffset tAttractor tLayers @@ -77,7 +86,6 @@ void vyyerror (char *fmt, ...); %token tScalarPoint tVectorPoint tTensorPoint %token tBSpline tNurbs tOrder tWith tBounds tKnots %token tColor tOptions tFor tEndFor tScript tExit tMerge -%token tGeneral tGeometry tMesh tPostProcessing tPrint %token tB_SPLINE_SURFACE_WITH_KNOTS %token tB_SPLINE_CURVE_WITH_KNOTS @@ -93,18 +101,32 @@ void vyyerror (char *fmt, ...); %token tSolid tEndSolid tVertex tFacet tNormal tOuter tLoopSTL tEndLoop tEndFacet -%type <d> FExpr FExpr_Single -%type <v> VExpr RGBAExpr +%type <d> FExpr FExpr_Single +%type <v> VExpr VExpr_Single %type <l> ListOfShapes Duplicata Transform MultipleShape %type <l> ListOfStrings ListOfDouble ListOfListOfDouble %type <s> Shape %type <i> BoolExpr - -%left '<' '>' -%left '+' '-' -%left '*' '/' '%' -%left UMINUS -%right '^' +%type <u> Color + +/* ------------------------------------------------------------------ */ +/* Operators (with ascending priority) : cf. C language */ +/* */ +/* Notes: - evaluation order (%left, %right) */ +/* - UNARYPREC is a dummy terminal to resolve ambiguous cases */ +/* for + and - (which exist in both unary and binary form) */ +/* ------------------------------------------------------------------ */ +%left tAFFECT tAFFECTPLUS tAFFECTMINUS tAFFECTTIMES tAFFECTDIVIDE +%right '?' tDOTS +%left tAND tOR +%left tNOTEQUAL tEQUAL tAPPROXEQUAL +%left '<' '>' tLESSOREQUAL tGREATEROREQUAL +%left '+' '-' +%left '*' '/' '%' +%left tCROSSPRODUCT +%left UNARYPREC '!' +%right '^' +%left tPLUSPLUS tMINUSMINUS %start All @@ -341,6 +363,7 @@ GeomFormatList : GeomFormat : View { return 1; } + | Printf { return 1; } | Affectation { return 1; } | Shape { return 1; } | Transform { return 1; } @@ -354,9 +377,17 @@ GeomFormat : /* | Script { return 1; }*/ | Command { return 1; } | tOptions '{' Options '}' { return 1; } + | tScript '{' Scripts '}' { return 1; } | error tEND { yyerrok; return 1;} ; +Printf : + tPrintf '(' tBIGSTR ',' FExpr ')' tEND + { + Msg(PARSER_INFO, $3, $5); + } +; + /* ------------ V I E W ------------ */ @@ -1429,186 +1460,209 @@ Options : ; Option : - tGeneral '{' GeneralOptions '}' - | tGeometry '{' GeometryOptions '}' - | tMesh '{' MeshOptions '}' - | tPostProcessing '{' PostProcessingOptions '}' - | tPrint '{' PrintOptions '}' -; - -GeneralOptions : - /* empty */ - | GeneralOptions GeneralOption -; - -GeneralOption : - tSTRING tAFFECT tBIGSTR tEND - { - if(!Set_StringOption($1, GeneralOptions_String, $3)) - vyyerror("Unknown General Option (String) '%s'", $1); - } - | tSTRING tAFFECT FExpr tEND - { - if(!Set_NumberOption($1, GeneralOptions_Number, $3)) - vyyerror("Unknown General Option (Number) '%s'", $1); - } - | tSTRING tAFFECT VExpr tEND - { if(!Set_ArrayOption($1, GeneralOptions_Array, $3)) - vyyerror("Unknown General Option (Array) '%s'", $1); - } - | tColor - { ColorField = GeneralOptions_Color; } - '{' ColorAffects '}' -; - -GeometryOptions : - /* empty */ - | GeometryOptions GeometryOption -; - -GeometryOption : - tSTRING tAFFECT tBIGSTR tEND - { - if(!Set_StringOption($1, GeometryOptions_String, $3)) - vyyerror("Unknown Geometry Option (String) '%s'", $1); + Printf + { } - | tSTRING tAFFECT FExpr tEND + | tSTRING '.' tSTRING tAFFECT tBIGSTR tEND { - if(!Set_NumberOption($1, GeometryOptions_Number, $3)) - vyyerror("Unknown Geometry Option (Number) '%s'", $1); + if(!(pStrCat = Get_StringOptionCategory($1))) + vyyerror("Unknown String Option Class '%s'", $1); + else{ + if(!(pStrOpt = Get_StringOption($3, pStrCat))) + vyyerror("Unknown String Option '%s.%s'", $1, $3); + else{ + *pStrOpt = $5 ; + } + } } - | tSTRING tAFFECT VExpr tEND + | tSTRING '.' tSTRING tAFFECT FExpr tEND { - if(!Set_ArrayOption($1, GeometryOptions_Array, $3)) - vyyerror("Unknown Geometry Option (Array) '%s'", $1); - } - | tColor - { ColorField = GeometryOptions_Color; } - '{' ColorAffects '}' -; - -MeshOptions : - /* empty */ - | MeshOptions MeshOption -; - -MeshOption : - tSTRING tAFFECT tBIGSTR tEND - { - if(!Set_StringOption($1, MeshOptions_String, $3)) - vyyerror("Unknown Mesh Option (String) '%s'", $1); + if(!(pNumCat = Get_NumberOptionCategory($1))) + vyyerror("Unknown Numeric Option Class '%s'", $1); + else{ + if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i))) + vyyerror("Unknown Numeric Option '%s.%s'", $1, $3); + else{ + switch(i){ + case GMSH_DOUBLE : *(double*)pNumOpt = $5 ; break ; + case GMSH_FLOAT : *(float*)pNumOpt = (float)$5 ; break ; + case GMSH_LONG : *(long*)pNumOpt = (long)$5 ; break ; + case GMSH_INT : *(int*)pNumOpt = (int)$5 ; break ; + } + } + } } - | tSTRING tAFFECT FExpr tEND + | tSTRING '.' tSTRING tAFFECTPLUS FExpr tEND { - if(!Set_NumberOption($1, MeshOptions_Number, $3)) - vyyerror("Unknown Mesh Option (Number) '%s'", $1); + if(!(pNumCat = Get_NumberOptionCategory($1))) + vyyerror("Unknown Numeric Option Class '%s'", $1); + else{ + if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i))) + vyyerror("Unknown Numeric Option '%s.%s'", $1, $3); + else{ + switch(i){ + case GMSH_DOUBLE : *(double*)pNumOpt += $5 ; break ; + case GMSH_FLOAT : *(float*)pNumOpt += (float)$5 ; break ; + case GMSH_LONG : *(long*)pNumOpt += (long)$5 ; break ; + case GMSH_INT : *(int*)pNumOpt += (int)$5 ; break ; + } + } + } } - | tSTRING tAFFECT VExpr tEND + | tSTRING '.' tSTRING tAFFECTMINUS FExpr tEND { - if(!Set_ArrayOption($1, MeshOptions_Array, $3)) - vyyerror("Unknown Mesh Option (Array) '%s'", $1); + if(!(pNumCat = Get_NumberOptionCategory($1))) + vyyerror("Unknown Numeric Option Class '%s'", $1); + else{ + if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i))) + vyyerror("Unknown Numeric Option '%s.%s'", $1, $3); + else{ + switch(i){ + case GMSH_DOUBLE : *(double*)pNumOpt -= $5 ; break ; + case GMSH_FLOAT : *(float*)pNumOpt -= (float)$5 ; break ; + case GMSH_LONG : *(long*)pNumOpt -= (long)$5 ; break ; + case GMSH_INT : *(int*)pNumOpt -= (int)$5 ; break ; + } + } + } } - | tColor - { ColorField = MeshOptions_Color; } - '{' ColorAffects '}' -; - -PostProcessingOptions : - /* empty */ - | PostProcessingOptions PostProcessingOption -; - -PostProcessingOption : - tSTRING tAFFECT tBIGSTR tEND - { - if(!Set_StringOption($1, PostProcessingOptions_String, $3)) - vyyerror("Unknown PostProcessing Option (String) '%s'", $1); + | tSTRING '.' tSTRING tAFFECTTIMES FExpr tEND + { + if(!(pNumCat = Get_NumberOptionCategory($1))) + vyyerror("Unknown Numeric Option Class '%s'", $1); + else{ + if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i))) + vyyerror("Unknown Numeric Option '%s.%s'", $1, $3); + else{ + switch(i){ + case GMSH_DOUBLE : *(double*)pNumOpt *= $5 ; break ; + case GMSH_FLOAT : *(float*)pNumOpt *= (float)$5 ; break ; + case GMSH_LONG : *(long*)pNumOpt *= (long)$5 ; break ; + case GMSH_INT : *(int*)pNumOpt *= (int)$5 ; break ; + } + } + } } - | tSTRING tAFFECT FExpr tEND - { - if(!Set_NumberOption($1, PostProcessingOptions_Number, $3)) - vyyerror("Unknown PostProcessing Option (Number) '%s'", $1); + | tSTRING '.' tSTRING tAFFECTDIVIDE FExpr tEND + { + if(!(pNumCat = Get_NumberOptionCategory($1))) + vyyerror("Unknown Numeric Option Class '%s'", $1); + else{ + if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i))) + vyyerror("Unknown Numeric Option '%s.%s'", $1, $3); + else{ + switch(i){ + case GMSH_DOUBLE : *(double*)pNumOpt /= $5 ; break ; + case GMSH_FLOAT : *(float*)pNumOpt /= (float)$5 ; break ; + case GMSH_LONG : *(long*)pNumOpt /= (long)$5 ; break ; + case GMSH_INT : *(int*)pNumOpt /= (int)$5 ; break ; + } + } + } } - | tSTRING tAFFECT VExpr tEND - { - if(!Set_ArrayOption($1, PostProcessingOptions_Array, $3)) - vyyerror("Unknown PostProcessing (Array) Option '%s'", $1); + | tSTRING '.' tSTRING tPLUSPLUS tEND + { + if(!(pNumCat = Get_NumberOptionCategory($1))) + vyyerror("Unknown Numeric Option Class '%s'", $1); + else{ + if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i))) + vyyerror("Unknown Numeric Option '%s.%s'", $1, $3); + else{ + switch(i){ + case GMSH_DOUBLE : *(double*)pNumOpt += 1. ; break ; + case GMSH_FLOAT : *(float*)pNumOpt += 1. ; break ; + case GMSH_LONG : *(long*)pNumOpt += 1 ; break ; + case GMSH_INT : *(int*)pNumOpt += 1 ; break ; + } + } + } } - | tColor - { ColorField = PostProcessingOptions_Color; } - '{' ColorAffects '}' -; - -PrintOptions : - /* empty */ - | PrintOptions PrintOption -; - -PrintOption : - tSTRING tAFFECT tBIGSTR tEND + | tSTRING '.' tSTRING tMINUSMINUS tEND { - if(!Set_StringOption($1, PrintOptions_String, $3)) - vyyerror("Unknown Print Option (String) '%s'", $1); + if(!(pNumCat = Get_NumberOptionCategory($1))) + vyyerror("Unknown Numeric Option Class '%s'", $1); + else{ + if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i))) + vyyerror("Unknown Numeric Option '%s.%s'", $1, $3); + else{ + switch(i){ + case GMSH_DOUBLE : *(double*)pNumOpt -= 1. ; break ; + case GMSH_FLOAT : *(float*)pNumOpt -= 1. ; break ; + case GMSH_LONG : *(long*)pNumOpt -= 1 ; break ; + case GMSH_INT : *(int*)pNumOpt -= 1 ; break ; + } + } + } } - | tSTRING tAFFECT FExpr tEND + | tSTRING '.' tSTRING tAFFECT VExpr tEND { - if(!Set_NumberOption($1, PrintOptions_Number, $3)) - vyyerror("Unknown Print Option (Number) '%s'", $1); + if(!(pArrCat = Get_ArrayOptionCategory($1))) + vyyerror("Unknown Array Option Class '%s'", $1); + else{ + if(!(pArrOpt = Get_ArrayOption($3, pArrCat, &i))) + vyyerror("Unknown Array Option '%s.%s'", $1, $3); + else{ + switch(i){ + case GMSH_DOUBLE : + ((double*)pNumOpt)[0] = $5[0] ; + ((double*)pNumOpt)[1] = $5[1] ; + ((double*)pNumOpt)[2] = $5[2] ; + ((double*)pNumOpt)[3] = $5[3] ; + break ; + case GMSH_FLOAT : + ((float*)pNumOpt)[0] = (float)$5[0] ; + ((float*)pNumOpt)[1] = (float)$5[1] ; + ((float*)pNumOpt)[2] = (float)$5[2] ; + ((float*)pNumOpt)[3] = (float)$5[3] ; + break ; + case GMSH_LONG : + ((long*)pNumOpt)[0] = (long)$5[0] ; + ((long*)pNumOpt)[1] = (long)$5[1] ; + ((long*)pNumOpt)[2] = (long)$5[2] ; + ((long*)pNumOpt)[3] = (long)$5[3] ; + break ; + case GMSH_INT : + ((int*)pNumOpt)[0] = (int)$5[0] ; + ((int*)pNumOpt)[1] = (int)$5[1] ; + ((int*)pNumOpt)[2] = (int)$5[2] ; + ((int*)pNumOpt)[3] = (int)$5[3] ; + break ; + } + } + } } - | tSTRING tAFFECT VExpr tEND + | tSTRING '.' tColor '.' tSTRING tAFFECT Color tEND { - if(!Set_ArrayOption($1, PrintOptions_Array, $3)) - vyyerror("Unknown Print Option (Array) '%s'", $1); + if(!(pColCat = Get_ColorOptionCategory($1))) + vyyerror("Unknown Color Option Class '%s'", $1); + else{ + if(!(pColOpt = Get_ColorOption($5, pColCat))) + vyyerror("Unknown Color Option '%s.%s'", $1, $5); + else{ + *pColOpt = $7 ; + } + } } - | tColor - { ColorField = PrintOptions_Color; } - '{' ColorAffects '}' ; -ColorAffects : +/* --------------- + S C R I P T S + --------------- */ + +Scripts : /* empty */ - | ColorAffect ColorAffects + | Scripts Script ; -ColorAffect : - tSTRING tAFFECT tSTRING tEND - { - i = Get_ColorForString(ColorString, -1, $3, &flag); - if(flag) vyyerror("Unknown Color '%s'", $3); - if(!Set_ColorOption($1, ColorField, i)) - vyyerror("Unknown Color Field '%s'", $1); - } - | tSTRING tAFFECT '{' tSTRING ',' FExpr '}' tEND - { - i = Get_ColorForString(ColorString, (int)$6, $4, &flag); - if(flag) vyyerror("Unknown Color '%s'", $4); - if(!Set_ColorOption($1, ColorField, i)) - vyyerror("Unknown Color Field '%s'", $1); - } - | tSTRING tAFFECT RGBAExpr tEND - { - if(!Set_ColorOption($1, ColorField, - PACK_COLOR((int)$3[0], (int)$3[1], (int)$3[2], (int)$3[3]))) - vyyerror("Unknown Color Field '%s'", $1); - } +Script : + Option +/* + | Action + | Loop + | Test +*/ ; -RGBAExpr : - '{' FExpr ',' FExpr ',' FExpr ',' FExpr '}' - { - $$[0]=$2; - $$[1]=$4; - $$[2]=$6; - $$[3]=$8; - } - | '{' FExpr ',' FExpr ',' FExpr '}' - { - $$[0]=$2; - $$[1]=$4; - $$[2]=$6; - $$[3]=255.; - } -; /* --------------- G E N E R A L @@ -1624,15 +1678,26 @@ BoolExpr : ; FExpr : - FExpr_Single { $$ = $1; } - | '(' FExpr ')' { $$ = $2; } - | FExpr '-' FExpr { $$ = $1 - $3; } - | FExpr '+' FExpr { $$ = $1 + $3; } - | FExpr '*' FExpr { $$ = $1 * $3; } - | FExpr '/' FExpr { $$ = $1 / $3; } - | FExpr '^' FExpr { $$ = pow($1, $3); } - | '-' FExpr %prec UMINUS { $$ = - $2; } - | '+' FExpr %prec UMINUS { $$ = $2; } + FExpr_Single { $$ = $1; } + | '(' FExpr ')' { $$ = $2 ; } + | '-' FExpr %prec UNARYPREC { $$ = -$2 ; } + | '+' FExpr %prec UNARYPREC { $$ = $2; } + | '!' FExpr { $$ = !$2 ; } + | FExpr '-' FExpr { $$ = $1 - $3 ; } + | FExpr '+' FExpr { $$ = $1 + $3 ; } + | FExpr '*' FExpr { $$ = $1 * $3 ; } + | FExpr '/' FExpr { $$ = $1 / $3 ; } + | FExpr '%' FExpr { $$ = (int)$1 % (int)$3 ; } + | FExpr '^' FExpr { $$ = pow($1,$3) ; } + | FExpr '<' FExpr { $$ = $1 < $3 ; } + | FExpr '>' FExpr { $$ = $1 > $3 ; } + | FExpr tLESSOREQUAL FExpr { $$ = $1 <= $3 ; } + | FExpr tGREATEROREQUAL FExpr { $$ = $1 >= $3 ; } + | FExpr tEQUAL FExpr { $$ = $1 == $3 ; } + | FExpr tNOTEQUAL FExpr { $$ = $1 != $3 ; } + | FExpr tAND FExpr { $$ = $1 && $3 ; } + | FExpr tOR FExpr { $$ = $1 || $3 ; } + | FExpr '?' FExpr tDOTS FExpr { $$ = $1? $3 : $5 ; } | tExp '(' FExpr ')' { $$ = exp($3); } | tLog '(' FExpr ')' { $$ = log($3); } | tLog10 '(' FExpr ')' { $$ = log10($3); } @@ -1667,6 +1732,57 @@ FExpr_Single : else $$ = TheSymbol.val ; Free($1); } + | tSTRING '.' tSTRING + { + if(!(pNumCat = Get_NumberOptionCategory($1))) + vyyerror("Unknown Numeric Option Class '%s'", $1); + else{ + if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i))) + vyyerror("Unknown Numeric Option '%s.%s'", $1, $3); + else{ + switch(i){ + case GMSH_DOUBLE : $$ = *(double*)pNumOpt ; break ; + case GMSH_FLOAT : $$ = (double)(*(float*)pNumOpt) ; break ; + case GMSH_LONG : $$ = (double)(*(long*)pNumOpt) ; break ; + case GMSH_INT : $$ = (double)(*(int*)pNumOpt) ; break ; + } + } + } + } + | tSTRING '.' tSTRING tPLUSPLUS + { + if(!(pNumCat = Get_NumberOptionCategory($1))) + vyyerror("Unknown Numeric Option Class '%s'", $1); + else{ + if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i))) + vyyerror("Unknown Numeric Option '%s.%s'", $1, $3); + else{ + switch(i){ + case GMSH_DOUBLE : $$ = (*(double*)pNumOpt += 1.) ; break ; + case GMSH_FLOAT : $$ = (double)(*(float*)pNumOpt += 1.) ; break ; + case GMSH_LONG : $$ = (double)(*(long*)pNumOpt += 1) ; break ; + case GMSH_INT : $$ = (double)(*(int*)pNumOpt += 1) ; break ; + } + } + } + } + | tSTRING '.' tSTRING tMINUSMINUS + { + if(!(pNumCat = Get_NumberOptionCategory($1))) + vyyerror("Unknown Numeric Option Class '%s'", $1); + else{ + if(!(pNumOpt = Get_NumberOption($3, pNumCat, &i))) + vyyerror("Unknown Numeric Option '%s.%s'", $1, $3); + else{ + switch(i){ + case GMSH_DOUBLE : $$ = (*(double*)pNumOpt -= 1.) ; break ; + case GMSH_FLOAT : $$ = (double)(*(float*)pNumOpt -= 1.) ; break ; + case GMSH_LONG : $$ = (double)(*(long*)pNumOpt -= 1) ; break ; + case GMSH_INT : $$ = (double)(*(int*)pNumOpt -= 1) ; break ; + } + } + } + } ; FExpr_Range : @@ -1690,37 +1806,43 @@ FExpr_Range : ; VExpr : - '{' FExpr ',' FExpr ',' FExpr ',' FExpr ',' FExpr '}' + VExpr_Single { - $$[0]=$2; - $$[1]=$4; - $$[2]=$6; - $$[3]=$8; - $$[4]=$10; + $$ = $1; } - | '{' FExpr ',' FExpr ',' FExpr ',' FExpr '}' + | '-' VExpr %prec UNARYPREC + { + for(i=0 ; i<6 ; i++) $$[i] = -$2[i] ; + } + | '+' VExpr %prec UNARYPREC + { + $$ = $2; + } + | VExpr '-' VExpr + { + for(i=0 ; i<6 ; i++) $$[i] = $1[i] - $3[i] ; + } + | VExpr '+' VExpr { - $$[0]=$2; - $$[1]=$4; - $$[2]=$6; - $$[3]=$8; - $$[4]=1.0; + for(i=0 ; i<6 ; i++) $$[i] = $1[i] + $3[i] ; + } + +VExpr_Single : + '{' FExpr ',' FExpr ',' FExpr ',' FExpr ',' FExpr '}' + { + $$[0]=$2; $$[1]=$4; $$[2]=$6; $$[3]=$8; $$[4]=$10; + } + | '{' FExpr ',' FExpr ',' FExpr ',' FExpr '}' + { + $$[0]=$2; $$[1]=$4; $$[2]=$6; $$[3]=$8; $$[4]=1.0; } | '{' FExpr ',' FExpr ',' FExpr '}' { - $$[0]=$2; - $$[1]=$4; - $$[2]=$6; - $$[3]=0.0; - $$[4]=1.0; + $$[0]=$2; $$[1]=$4; $$[2]=$6; $$[3]=0.0; $$[4]=1.0; } | '(' FExpr ',' FExpr ',' FExpr ')' { - $$[0]=$2; - $$[1]=$4; - $$[2]=$6; - $$[3]=0.0; - $$[4]=1.0; + $$[0]=$2; $$[1]=$4; $$[2]=$6; $$[3]=0.0; $$[4]=1.0; } ; @@ -1782,12 +1904,6 @@ ListOfDouble : { $$=ListOfDouble_L; } -/* - | '(' RecursiveListOfDouble ')' - { - $$=ListOfDouble_L; - } -*/ ; @@ -1820,6 +1936,38 @@ RecursiveListOfDouble : } ; +Color : + '{' FExpr ',' FExpr ',' FExpr ',' FExpr '}' + { + $$ = PACK_COLOR((int)$2, (int)$4, (int)$6, (int)$8); + } + | '{' FExpr ',' FExpr ',' FExpr '}' + { + $$ = PACK_COLOR((int)$2, (int)$4, (int)$6, 255); + } + | '{' tSTRING ',' FExpr '}' + { + $$ = Get_ColorForString(ColorString, (int)$4, $2, &flag); + if(flag) vyyerror("Unknown Color '%s'", $2); + } + | tSTRING + { + $$ = Get_ColorForString(ColorString, -1, $1, &flag); + if(flag) vyyerror("Unknown Color '%s'", $1); + } + | tSTRING '.' tColor '.' tSTRING + { + if(!(pColCat = Get_ColorOptionCategory($1))) + vyyerror("Unknown Color Option Class '%s'", $1); + else{ + if(!(pColOpt = Get_ColorOption($5, pColCat))) + vyyerror("Unknown Color Option '%s.%s'", $1, $5); + else{ + $$ = *pColOpt ; + } + } + } +; %%