#ifdef __STDC__
# define	P(s) s
#else
# define P(s) ()
#endif


/* alloc.c */
char *Alloc P((int num ));

/* arc.c */
ENTITY *ArcDxfParse P((LAYER **layerlist ));
int ArcTesselationNumber P((double radius , double deltaangle ));
VOID ArcDefOutput P((ENTITY *entity ));

/* attrib.c */
ATTRIB *AttribDxfParse P((LAYER **layerlist ));

/* block.c */
BLOCK *BlockDxfParse P((void ));
BLOCK *BlockSearch P((char *blockname ));
VOID BlockCrlOutput P((BLOCK *block ));
VOID BlockDefOutput P((BLOCK *block ));
VOID BlockNffOutput P((BLOCK *block ));
VOID BlockDxfOutput P((BLOCK *block ));

/* check.c */
VOID PlaneEquation P((int n , double p [][3 ], double *a , double *b , double *c , double *d ));
int CheckDirection P((int npoints , double polygon [][3 ], double point [3 ]));
int CheckLayerName P((LAYER *layer ));
VOID ReversePolygon P((int n , double p [][3 ]));
int CheckOrientation P((int n , double p [][3 ], LAYER *layer ));

/* circle.c */
ENTITY *CircleDxfParse P((LAYER **layerlist ));
VOID CircleTriangleTesselation P((int n , double center [3 ], double start [3 ], double end [3 ], ENTITY *entity ));
VOID CircleRectangleTesselation P((int m , int n , double *p0 , double *p1 , double *p2 , double *p3 , ENTITY *entity ));
int CircleTesselationNumber P((double radius ));
VOID CircleDefOutput P((ENTITY *entity ));
VOID CircleNffOutput P((ENTITY *entity ));

/* coord.c */
VOID CoordDxfParse P((int number , double point []));
int CoordSame P((double *p , double *q ));
VOID CoordDxfOutput P((int number , double point [3 ]));
double CoordDistance P((double *pt1 , double *pt2 ));

/* dimensio.c */
ENTITY *DimensionDxfParse P((LAYER **layerlist ));
VOID DimensionDefOutput P((ENTITY *entity ));
VOID DimensionNffOutput P((ENTITY *entity ));
VOID DimensionDxfOutput P((ENTITY *entity ));

/* entity.c */
ENTITY *EntityDxfParse P((LAYER **layerlist ));

/* error.c */
ENTITY *NullDxfParse P((void ));
VOID NullDefOutput P((void ));
VOID NullNffOutput P((void ));
VOID NullDxfOutput P((void ));
int PrintGroup P((GROUP *group ));
VOID DXFERR P((char *fmt , ... ));
VOID DXFWARN P((char *fmt , ... ));
VOID GENWARN P((char *fmt , ... ));
VOID GENERR P((char *fmt , ...));

/* face.c */
ENTITY *FaceDxfParse P((LAYER **layerlist ));
int FaceDegeneratedCheck P((int n , double p [][3 ]));
VOID FaceDefOutput P((ENTITY *entity ));

/* group.c */
int CmpGroupString P((GROUP *group , int code , char *strval ));
int CmpGroupInteger P((GROUP *group , int code , int integer ));

/* insert.c */
ENTITY *InsertDxfParse P((LAYER **layerlist ));
VOID InsertDefOutput P((ENTITY *entity ));

/* layer.c */
LAYER *LayerInsert P((LAYER **layerlist , char *layername ));
VOID EntityInsertToLayer P((ENTITY *entity ));
LAYER *LayerDxfParse P((LAYER **layerlist ));

/* line.c */
ENTITY *LineDxfParse P((LAYER **layerlist ));
VOID LineDefOutput P((ENTITY *entity ));

/* main.c */
VOID PrintStatistics P((FILE *fd , char *progname ));
VOID Usage P((void ));
int main P((int argc , char *argv []));

/* matrix.c */
VOID MatrixUnit P((MATRIX matrix [2 ]));
VOID MatrixRotate P((MATRIX matrix [2 ], double vector [3 ], double theta ));
VOID MatrixTranslate P((MATRIX matrix [2 ], double deltax , double deltay , double deltaz ));
VOID MatrixScale P((MATRIX matrix [2 ], double xscale , double yscale , double zscale ));
VOID MatrixExtrusion P((MATRIX matrix [2 ], double extrusion [3 ]));
VOID MatrixMultiply P((MATRIX m1 [2 ], MATRIX m2 [2 ], MATRIX m [2 ]));
VOID XformPoint P((MATRIX m , double p [3 ], double q [3 ]));
VOID XformVector P((MATRIX m , double p [3 ], double q [3 ]));
VOID MatrixPrint P((MATRIX m ));

/* name.c */
char *NameInsert P((LAYER *layer ));
VOID NameDxfOutput P((LAYER *layer ));
VOID NameOutput P((LAYER *layer ));

/* options.c */
int OptionsDxfParse P((OPTIONS **options ));
int OptionsThickness P((OPTIONS *options , double *thickness ));
double *OptionsExtrusion P((OPTIONS *options ));
int OptionsExtrusionVector P((OPTIONS *options , double vector [3 ]));

/* output.c */
VOID OutputDxfPolygon P((int n , double p [][3 ], ENTITY *entity ));
VOID OutputNffPhongPolygon P((int n , double point [][3 ], double normal [][3 ], ENTITY *entity ));
VOID OutputPolygon P((int n , double p [][3 ], ENTITY *entity ));
int OutputFile P((char *OutFileName ));

/* parse.c */
VOID AsciiGetNextGroup P((void ));
VOID BinaryGetNextGroup P((void ));
VOID SkipSection P((void ));
VOID ParseBlocksSection P((void ));
VOID ParseEntitiesSection P((void ));
VOID SkipEndOfFile P((void ));
int ParseDxfFile P((char *FileName ));

/* point.c */
ENTITY *PointDxfParse P((LAYER **layerlist ));
VOID PointDefOutput P((ENTITY *entity ));
VOID PointNffOutput P((ENTITY *entity ));
VOID PointDxfOutput P((ENTITY *entity ));

/* polyline.c */
ENTITY *PolylineDxfParse P((LAYER **layerlist ));
VOID PolylineDefOutput P((ENTITY *entity ));

/* shape.c */
ENTITY *ShapeDxfParse P((LAYER **layerlist ));
VOID ShapeDefOutput P((ENTITY *entity ));
VOID ShapeNffOutput P((ENTITY *entity ));
VOID ShapeDxfOutput P((ENTITY *entity ));

/* solid.c */
ENTITY *SolidDxfParse P((LAYER **layerlist ));
VOID SolidDefOutput P((ENTITY *entity ));

/* stack.c */
VOID StackPush P((INSERT *insert , MATRIX matrix [2 ]));
VOID StackPop P((void ));

/* text.c */
ENTITY *TextDxfParse P((LAYER **layerlist ));
VOID TextDefOutput P((ENTITY *entity ));
VOID TextNffOutput P((ENTITY *entity ));
VOID TextDxfOutput P((ENTITY *entity ));

/* trace.c */
ENTITY *TraceDxfParse P((LAYER **layerlist ));
VOID TraceDefOutput P((ENTITY *entity ));

/* vector.c */
double VecNormalize P((double s [3 ]));
VOID ArbitraryAxis P((double xaxis [3 ], double yaxis [3 ], double zaxis [3 ]));
VOID VecCopy P((double a [3 ], double b [3 ]));
VOID VecScale P((double s , double a [3 ], double b [3 ]));
VOID VecAdd P((double a [3 ], double b [3 ], double c [3 ]));
VOID VecSub P((double a [3 ], double b [3 ], double c [3 ]));
double VecDot P((double a [3 ], double b [3 ]));
VOID VecNegate P((double a [3 ], double b [3 ]));
VOID VecAddS P((double s , double a [3 ], double b [3 ], double c [3 ]));
VOID VecCross P((double a [3 ], double b [3 ], double c [3 ]));
double VecLength P((double s [3 ]));

/* vertex.c */
VERTEX *VertexDxfParse P((LAYER **layerlist ));

#undef P
