Skip to content
Snippets Groups Projects
Commit bb86220e authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

Corrected syntax

parent 736436f7
Branches
Tags
No related merge requests found
/* $Id: Geo.cpp,v 1.4 2000-11-26 15:43:45 geuzaine Exp $ */ /* $Id: Geo.cpp,v 1.5 2000-11-28 14:42:42 geuzaine Exp $ */
#include "Gmsh.h" #include "Gmsh.h"
#include "Const.h" #include "Const.h"
...@@ -73,21 +73,21 @@ void add_infile(char *text, char *fich){ ...@@ -73,21 +73,21 @@ void add_infile(char *text, char *fich){
void del_pnt(int p1, char *fich){ void del_pnt(int p1, char *fich){
char text[BUFFSIZE]; char text[BUFFSIZE];
sprintf(text,"Delete {\n Point(%d);\n}",p1); sprintf(text,"Delete {\n Point{%d};\n}",p1);
add_infile(text,fich); add_infile(text,fich);
} }
void del_seg(int p1, char *fich){ void del_seg(int p1, char *fich){
char text[BUFFSIZE]; char text[BUFFSIZE];
sprintf(text,"Delete {\n Line(%d);\n}",p1); sprintf(text,"Delete {\n Line{%d};\n}",p1);
add_infile(text,fich); add_infile(text,fich);
} }
void del_srf(int p1, char *fich){ void del_srf(int p1, char *fich){
char text[BUFFSIZE]; char text[BUFFSIZE];
sprintf(text,"Delete {\n Surface(%d);\n}",p1); sprintf(text,"Delete {\n Surface{%d};\n}",p1);
add_infile(text,fich); add_infile(text,fich);
} }
...@@ -164,10 +164,10 @@ void add_trsfline (int N, int *l, char *fich){ ...@@ -164,10 +164,10 @@ void add_trsfline (int N, int *l, char *fich){
} }
if(Mode_Transfinite == 0) if(Mode_Transfinite == 0)
sprintf(text2,"} = %s;",nb_pts); sprintf(text2,"} = %s;",nb_pts);
else if(Mode_Transfinite == 1)
sprintf(text2,"} = %s Using Progression %s;",nb_pts,mode_value);
else if(Mode_Transfinite == 2) else if(Mode_Transfinite == 2)
sprintf(text2,"} = %s Using Bump %s;",nb_pts,mode_value); sprintf(text2,"} = %s Using Bump %s;",nb_pts,mode_value);
else if(Mode_Transfinite == 1)
sprintf(text2,"} = %s Using Power %s;",nb_pts,mode_value);
strcat(text,text2); strcat(text,text2);
add_infile(text,fich); add_infile(text,fich);
} }
...@@ -191,16 +191,16 @@ void add_point(char *fich){ ...@@ -191,16 +191,16 @@ void add_point(char *fich){
void add_attractor(char *fich, int ip, int typ){ void add_attractor(char *fich, int ip, int typ){
char text[BUFFSIZE]; char text[BUFFSIZE];
if(typ == 0) { if(typ == 0) {
sprintf(text,"Attractor Point (%s,%s,%s) = {%d};", sprintf(text,"Attractor Point {%d} = {%s,%s,%s} = ;",
attrx_text,attry_text,attrdec_text,ip); ip,attrx_text,attry_text,attrdec_text);
} }
else if(typ == 1){ else if(typ == 1){
sprintf(text,"Attractor Line (%s,%s,%s) = {%d};", sprintf(text,"Attractor Line {%d} = {%s,%s,%s};",
attrx_text,attry_text,attrdec_text,ip); ip, attrx_text,attry_text,attrdec_text);
} }
else if(typ == 2) { else if(typ == 2) {
sprintf(text,"Attractor Surface (%s,%s,%s) = {%d};", sprintf(text,"Attractor Surface {%d} = {%s,%s,%s};",
attrx_text,attry_text,attrdec_text,ip); ip,attrx_text,attry_text,attrdec_text);
} }
add_infile(text,fich); add_infile(text,fich);
} }
...@@ -454,7 +454,7 @@ void add_physical_entity(List_T *list, char *fich, int type, int *num){ ...@@ -454,7 +454,7 @@ void add_physical_entity(List_T *list, char *fich, int type, int *num){
void extrude(int s, char *fich, char *what){ void extrude(int s, char *fich, char *what){
char text[BUFFSIZE]; char text[BUFFSIZE];
sprintf(text,"Extrude %s (%d, {%s,%s,%s});",what,s,tx_text,ty_text,tz_text); sprintf(text,"Extrude %s {%d, {%s,%s,%s}};",what,s,tx_text,ty_text,tz_text);
add_infile(text,fich); add_infile(text,fich);
add_infile("Coherence;",fich); add_infile("Coherence;",fich);
} }
...@@ -462,10 +462,10 @@ void translate_seg(int add, int s, char *fich){ ...@@ -462,10 +462,10 @@ void translate_seg(int add, int s, char *fich){
char text[BUFFSIZE]; char text[BUFFSIZE];
if(add) if(add)
sprintf(text,"Translate({%s,%s,%s}) {\n Duplicata { Line(%d); }\n}", sprintf(text,"Translate {%s,%s,%s} {\n Duplicata { Line{%d}; }\n}",
tx_text,ty_text,tz_text,s); tx_text,ty_text,tz_text,s);
else else
sprintf(text,"Translate({%s,%s,%s}) {\n Line(%d);\n}", sprintf(text,"Translate {%s,%s,%s} {\n Line{%d};\n}",
tx_text,ty_text,tz_text,s); tx_text,ty_text,tz_text,s);
add_infile(text,fich); add_infile(text,fich);
add_infile("Coherence;",fich); add_infile("Coherence;",fich);
...@@ -476,10 +476,10 @@ void translate_surf(int add, int s, char *fich){ ...@@ -476,10 +476,10 @@ void translate_surf(int add, int s, char *fich){
char text[BUFFSIZE]; char text[BUFFSIZE];
if(add) if(add)
sprintf(text,"Translate({%s,%s,%s}) {\n Duplicata { Surface(%d); }\n}", sprintf(text,"Translate {%s,%s,%s} {\n Duplicata { Surface{%d}; }\n}",
tx_text,ty_text,tz_text,s); tx_text,ty_text,tz_text,s);
else else
sprintf(text,"Translate({%s,%s,%s}) {\n Surface(%d);\n}", sprintf(text,"Translate {%s,%s,%s} {\n Surface{%d};\n}",
tx_text,ty_text,tz_text,s); tx_text,ty_text,tz_text,s);
add_infile(text,fich); add_infile(text,fich);
add_infile("Coherence;",fich); add_infile("Coherence;",fich);
...@@ -489,10 +489,10 @@ void translate_pt(int add, int s, char *fich){ ...@@ -489,10 +489,10 @@ void translate_pt(int add, int s, char *fich){
char text[BUFFSIZE]; char text[BUFFSIZE];
if(add) if(add)
sprintf(text,"Translate({%s,%s,%s}) {\n Duplicata { Point(%d); }\n}", sprintf(text,"Translate {%s,%s,%s} {\n Duplicata { Point{%d}; }\n}",
tx_text,ty_text,tz_text,s); tx_text,ty_text,tz_text,s);
else else
sprintf(text,"Translate({%s,%s,%s}) {\n Point(%d);\n}", sprintf(text,"Translate {%s,%s,%s} {\n Point{%d};\n}",
tx_text,ty_text,tz_text,s); tx_text,ty_text,tz_text,s);
add_infile(text,fich); add_infile(text,fich);
add_infile("Coherence;",fich); add_infile("Coherence;",fich);
...@@ -502,10 +502,10 @@ void rotate(int add, int s, char *fich, char *quoi){ ...@@ -502,10 +502,10 @@ void rotate(int add, int s, char *fich, char *quoi){
char text[BUFFSIZE]; char text[BUFFSIZE];
if(add) if(add)
sprintf(text,"Rotate({%s,%s,%s},{%s,%s,%s},%s) {\n Duplicata { %s(%d); }\n}", sprintf(text,"Rotate { {%s,%s,%s},{%s,%s,%s},%s } {\n Duplicata { %s{%d}; }\n}",
ax_text,ay_text,az_text,px_text,py_text,pz_text,angle_text, quoi,s); ax_text,ay_text,az_text,px_text,py_text,pz_text,angle_text, quoi,s);
else else
sprintf(text,"Rotate({%s,%s,%s},{%s,%s,%s},%s) {\n %s(%d);\n }", sprintf(text,"Rotate { {%s,%s,%s},{%s,%s,%s},%s } {\n %s{%d};\n }",
ax_text,ay_text,az_text,px_text,py_text,pz_text,angle_text, quoi,s); ax_text,ay_text,az_text,px_text,py_text,pz_text,angle_text, quoi,s);
add_infile(text,fich); add_infile(text,fich);
add_infile("Coherence;",fich); add_infile("Coherence;",fich);
...@@ -515,10 +515,10 @@ void dilate(int add, int s, char *fich, char *quoi){ ...@@ -515,10 +515,10 @@ void dilate(int add, int s, char *fich, char *quoi){
char text[BUFFSIZE]; char text[BUFFSIZE];
if(add) if(add)
sprintf(text,"Dilate({%s,%s,%s},%s) {\n Duplicata { %s(%d); }\n}", sprintf(text,"Dilate { {%s,%s,%s},%s } {\n Duplicata { %s{%d}; }\n}",
dx_text,dy_text,dz_text,df_text, quoi,s); dx_text,dy_text,dz_text,df_text, quoi,s);
else else
sprintf(text,"Dilate({%s,%s,%s},%s) {\n %s(%d);\n }", sprintf(text,"Dilate { {%s,%s,%s},%s } {\n %s{%d};\n }",
dx_text,dy_text,dz_text,df_text, quoi,s); dx_text,dy_text,dz_text,df_text, quoi,s);
add_infile(text,fich); add_infile(text,fich);
add_infile("Coherence;",fich); add_infile("Coherence;",fich);
...@@ -528,7 +528,7 @@ void dilate(int add, int s, char *fich, char *quoi){ ...@@ -528,7 +528,7 @@ void dilate(int add, int s, char *fich, char *quoi){
void protude(int s, char *fich, char *what){ void protude(int s, char *fich, char *what){
char text[BUFFSIZE]; char text[BUFFSIZE];
sprintf(text,"Extrude %s(%d, {%s,%s,%s}, {%s,%s,%s}, %s);",what,s,ax_text,ay_text, sprintf(text,"Extrude %s {%d, {%s,%s,%s}, {%s,%s,%s}, %s};",what,s,ax_text,ay_text,
az_text,px_text,py_text,pz_text,angle_text); az_text,px_text,py_text,pz_text,angle_text);
add_infile(text,fich); add_infile(text,fich);
add_infile("Coherence;",fich); add_infile("Coherence;",fich);
......
This diff is collapsed.
%{ /* $Id: Gmsh.y,v 1.8 2000-11-28 11:28:35 geuzaine Exp $ */ %{ /* $Id: Gmsh.y,v 1.9 2000-11-28 14:42:44 geuzaine Exp $ */
#include <stdarg.h> #include <stdarg.h>
...@@ -697,21 +697,21 @@ Shape : ...@@ -697,21 +697,21 @@ Shape :
$$.Type = MSH_PHYSICAL_POINT; $$.Type = MSH_PHYSICAL_POINT;
$$.Num = (int)$4; $$.Num = (int)$4;
} }
| tAttractor tPoint '(' FExpr ',' FExpr ',' FExpr ')' tAFFECT ListOfDouble tEND | tAttractor tPoint ListOfDouble tAFFECT '(' FExpr ',' FExpr ',' FExpr ')' tEND
{ {
Vertex *v; Vertex *v;
Attractor *a; Attractor *a;
double p; double p;
int ip; int ip;
for(int i=0;i<List_Nbr($11);i++){ for(int i=0;i<List_Nbr($3);i++){
List_Read($11,i,&p); List_Read($3,i,&p);
ip = (int)p; ip = (int)p;
v = FindVertex(ip,THEM); v = FindVertex(ip,THEM);
if(!v) if(!v)
vyyerror("Unkown Point %d", ip); vyyerror("Unkown Point %d", ip);
else{ else{
a = Create_Attractor(List_Nbr(THEM->Metric->Attractors)+1, a = Create_Attractor(List_Nbr(THEM->Metric->Attractors)+1,
$4,$6,$8,v,NULL,NULL); $6,$8,$10,v,NULL,NULL);
List_Add(THEM->Metric->Attractors,&a); List_Add(THEM->Metric->Attractors,&a);
} }
} }
...@@ -727,7 +727,7 @@ Shape : ...@@ -727,7 +727,7 @@ Shape :
v->lc = $5; v->lc = $5;
} }
} }
| tPoint '(' FExpr ')' tEND | tPoint '{' FExpr '}' tEND
{ {
$$.Type = MSH_POINT; $$.Type = MSH_POINT;
$$.Num = (int)$3; $$.Num = (int)$3;
...@@ -747,21 +747,21 @@ Shape : ...@@ -747,21 +747,21 @@ Shape :
$$.Type = MSH_SEGM_SPLN; $$.Type = MSH_SEGM_SPLN;
$$.Num = (int)$3; $$.Num = (int)$3;
} }
| tAttractor tLine '(' FExpr ',' FExpr ',' FExpr ')' tAFFECT ListOfDouble tEND | tAttractor tLine ListOfDouble tAFFECT '{' FExpr ',' FExpr ',' FExpr '}' tEND
{ {
Curve *c; Curve *c;
Attractor *a; Attractor *a;
double p; double p;
int ip; int ip;
for(int i=0;i<List_Nbr($11);i++){ for(int i=0;i<List_Nbr($3);i++){
List_Read($11,i,&p); List_Read($3,i,&p);
ip = (int)p; ip = (int)p;
c = FindCurve(ip,THEM); c = FindCurve(ip,THEM);
if(!c) if(!c)
vyyerror("Unkown Curve %d", ip); vyyerror("Unkown Curve %d", ip);
else{ else{
a = Create_Attractor(List_Nbr(THEM->Metric->Attractors)+1, a = Create_Attractor(List_Nbr(THEM->Metric->Attractors)+1,
$4,$6,$8,NULL,c,NULL); $6,$8,$10,NULL,c,NULL);
List_Add(THEM->Metric->Attractors,&a); List_Add(THEM->Metric->Attractors,&a);
} }
} }
...@@ -789,7 +789,7 @@ Shape : ...@@ -789,7 +789,7 @@ Shape :
$$.Num = (int)$3; $$.Num = (int)$3;
} }
| tParametric '(' FExpr ')' tAFFECT | tParametric '(' FExpr ')' tAFFECT
'(' FExpr ',' FExpr ',' tBIGSTR ',' tBIGSTR ',' tBIGSTR ')' tEND '{' FExpr ',' FExpr ',' tBIGSTR ',' tBIGSTR ',' tBIGSTR '}' tEND
{ {
Cdbseg101((int)$3,MSH_SEGM_PARAMETRIC,2,NULL,NULL,-1,-1,$7,$9,$11,$13,$15); Cdbseg101((int)$3,MSH_SEGM_PARAMETRIC,2,NULL,NULL,-1,-1,$7,$9,$11,$13,$15);
$$.Type = MSH_SEGM_PARAMETRIC ; $$.Type = MSH_SEGM_PARAMETRIC ;
...@@ -813,15 +813,6 @@ Shape : ...@@ -813,15 +813,6 @@ Shape :
Cdbz101((int)$4,$$.Type,0,0,0,0,0,NULL,$7,NULL); Cdbz101((int)$4,$$.Type,0,0,0,0,0,NULL,$7,NULL);
$$.Num = (int)$4; $$.Num = (int)$4;
} }
| tLine '(' FExpr ')' tEND
{
$$.Num = (int)$3;
Curve *c = FindCurve($$.Num,THEM);
if(!c)
vyyerror("Unkown Curve %d", $$.Num);
else
$$.Type = c->Typ;
}
| tBSpline '(' FExpr ')' tAFFECT ListOfDouble tEND | tBSpline '(' FExpr ')' tAFFECT ListOfDouble tEND
{ {
Cdbseg101((int)$3,MSH_SEGM_BSPLN,2,$6,NULL,-1,-1,0.,1.,NULL,NULL,NULL); Cdbseg101((int)$3,MSH_SEGM_BSPLN,2,$6,NULL,-1,-1,0.,1.,NULL,NULL,NULL);
...@@ -847,6 +838,15 @@ Shape : ...@@ -847,6 +838,15 @@ Shape :
AddCurveInDataBase ((int)$3,MSH_SEGM_NURBS,(int)$10,Temp,$8,-1,-1,0.,1.); AddCurveInDataBase ((int)$3,MSH_SEGM_NURBS,(int)$10,Temp,$8,-1,-1,0.,1.);
List_Delete(Temp); List_Delete(Temp);
} }
| tLine '{' FExpr '}' tEND
{
$$.Num = (int)$3;
Curve *c = FindCurve($$.Num,THEM);
if(!c)
vyyerror("Unkown Curve %d", $$.Num);
else
$$.Type = c->Typ;
}
/* -------- Surfaces -------- */ /* -------- Surfaces -------- */
...@@ -922,7 +922,7 @@ Shape : ...@@ -922,7 +922,7 @@ Shape :
$$.Type = MSH_SURF_LOOP; $$.Type = MSH_SURF_LOOP;
$$.Num = (int)$4; $$.Num = (int)$4;
} }
| tSurface '(' FExpr ')' tEND | tSurface '{' FExpr '}' tEND
{ {
$$.Num = (int)$3; $$.Num = (int)$3;
Surface *s = FindSurface($$.Num,THEM); Surface *s = FindSurface($$.Num,THEM);
...@@ -959,22 +959,22 @@ Shape : ...@@ -959,22 +959,22 @@ Shape :
------------------- */ ------------------- */
Transform : Transform :
tTranslate '(' VExpr ')' '{' MultipleShape '}' tTranslate VExpr '{' MultipleShape '}'
{ {
TranslateShapes ($3[0],$3[1],$3[2],$6,1); TranslateShapes ($2[0],$2[1],$2[2],$4,1);
$$ = $6; $$ = $4;
} }
| tRotate '(' VExpr ',' VExpr ',' FExpr ')' '{' MultipleShape '}' | tRotate '{' VExpr ',' VExpr ',' FExpr '}' '{' MultipleShape '}'
{ {
RotateShapes($3[0],$3[1],$3[2],$5[0],$5[1],$5[2],$7,$10); RotateShapes($3[0],$3[1],$3[2],$5[0],$5[1],$5[2],$7,$10);
$$ = $10; $$ = $10;
} }
| tSymmetry '(' VExpr ')' '{' MultipleShape '}' | tSymmetry VExpr '{' MultipleShape '}'
{ {
SymmetryShapes($3[0],$3[1],$3[2],$3[3],$6,1); SymmetryShapes($2[0],$2[1],$2[2],$2[3],$4,1);
$$ = $6; $$ = $4;
} }
| tDilate '(' VExpr ',' FExpr ')' '{' MultipleShape '}' | tDilate '{' VExpr ',' FExpr '}' '{' MultipleShape '}'
{ {
DilatShapes($3[0],$3[1],$3[2],$5,$8,1); DilatShapes($3[0],$3[1],$3[2],$5,$8,1);
$$ = $8; $$ = $8;
...@@ -1068,48 +1068,39 @@ Macro : ...@@ -1068,48 +1068,39 @@ Macro :
--------------- */ --------------- */
Extrude : Extrude :
tExtrude '(' FExpr ',' VExpr ')' tEND tExtrude tPoint '{' FExpr ',' VExpr '}' tEND
{ {
Extrude_ProtudeSurface(1,(int)$3,$5[0],$5[1],$5[2],0.,0.,0.,0.,0,NULL); Curve *pc, *prc;
} Extrude_ProtudePoint(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,&pc,&prc,NULL);
| tExtrude tSurface '(' FExpr ',' VExpr ')' tEND
{
Extrude_ProtudeSurface(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,0,NULL);
}
| tExtrude '(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' tEND
{
Extrude_ProtudeSurface(0,(int)$3,$5[0],$5[1],$5[2],$7[0],$7[1],$7[2],$9,0,NULL);
}
| tExtrude tSurface '(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' tEND
{
Extrude_ProtudeSurface(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10,0,NULL);
} }
| tExtrude tPoint '(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' tEND | tExtrude tPoint '{' FExpr ',' VExpr ',' VExpr ',' FExpr '}' tEND
{ {
Curve *pc, *prc; Curve *pc, *prc;
Extrude_ProtudePoint(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10, Extrude_ProtudePoint(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10,
&pc,&prc,NULL); &pc,&prc,NULL);
} }
| tExtrude tPoint '(' FExpr ',' VExpr ')' tEND | tExtrude tLine'{' FExpr ',' VExpr '}' tEND
{ {
Curve *pc, *prc; Extrude_ProtudeCurve(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,NULL);
Extrude_ProtudePoint(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,&pc,&prc,NULL);
} }
| tExtrude tLine'(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' tEND | tExtrude tLine'{' FExpr ',' VExpr ',' VExpr ',' FExpr '}' tEND
{ {
Extrude_ProtudeCurve(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10,NULL); Extrude_ProtudeCurve(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10,NULL);
} }
| tExtrude tLine'(' FExpr ',' VExpr ')' tEND | tExtrude tSurface '{' FExpr ',' VExpr '}' tEND
{ {
Extrude_ProtudeCurve(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,NULL); Extrude_ProtudeSurface(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,0,NULL);
}
| tExtrude tSurface '{' FExpr ',' VExpr ',' VExpr ',' FExpr '}' tEND
{
Extrude_ProtudeSurface(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10,0,NULL);
} }
| tExtrude tSurface '(' FExpr ',' VExpr ')' '{' ExtrudeParameters '}' tEND | tExtrude tSurface '{' FExpr ',' VExpr '}' '{' ExtrudeParameters '}' tEND
{ {
int vol = NEWREG(); int vol = NEWREG();
Extrude_ProtudeSurface(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,vol,&extr); Extrude_ProtudeSurface(1,(int)$4,$6[0],$6[1],$6[2],0.,0.,0.,0.,vol,&extr);
} }
| tExtrude tSurface '(' FExpr ',' VExpr ',' VExpr ',' FExpr ')' | tExtrude tSurface '{' FExpr ',' VExpr ',' VExpr ',' FExpr '}' '{' ExtrudeParameters '}'tEND
'{' ExtrudeParameters '}'tEND
{ {
int vol = NEWREG(); int vol = NEWREG();
Extrude_ProtudeSurface(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10,vol,&extr); Extrude_ProtudeSurface(0,(int)$4,$6[0],$6[1],$6[2],$8[0],$8[1],$8[2],$10,vol,&extr);
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
/* A lexical scanner generated by flex */ /* A lexical scanner generated by flex */
/* Scanner skeleton version: /* Scanner skeleton version:
* $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.10 2000-11-28 11:28:35 geuzaine Exp $ * $Header: /cvsroot/gmsh/Parser/Gmsh.yy.cpp,v 1.11 2000-11-28 14:42:44 geuzaine Exp $
*/ */
#define FLEX_SCANNER #define FLEX_SCANNER
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment