home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-385-Vol-1of3.iso
/
i
/
iritsm3s.zip
/
cagd_lib
/
bzr_read.c
< prev
next >
Wrap
C/C++ Source or Header
|
1991-09-11
|
10KB
|
326 lines
/******************************************************************************
* Bzr-Read.c - Bezier handling routines - read from file. *
*******************************************************************************
* Written by Gershon Elber, Mar. 90. *
******************************************************************************/
#ifdef __MSDOS__
#include <stdlib.h>
#endif /* __MSDOS__ */
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "cagd_loc.h"
/******************************************************************************
* Reads and returns bezier curve(s) list. *
* If error is found in reading the file, ErrStr is set to string describing *
* it and Line to the line it occured in file. *
* If no error is detected *ErrStr = NULL. *
******************************************************************************/
CagdCrvStruct *BzrCrvReadFromFile(char *FileName, char **ErrStr, int *ErrLine)
{
FILE *f;
char StringToken[LINE_LEN];
CagdCrvStruct *Crv,
*CrvTail = NULL,
*CrvList = NULL;
if ((f = fopen(FileName, "r")) == NULL) {
*ErrStr = "File not found";
*ErrLine = 0;
return NULL;
}
while (_CagdGetToken(f, StringToken) == TOKEN_OPEN_PAREN) {
_CagdUnGetToken(StringToken);
Crv = BzrCrvReadFromFile2(f, FALSE, ErrStr, ErrLine);
if (CrvList == NULL)
CrvList = CrvTail = Crv;
else {
CrvTail -> Pnext = Crv;
CrvTail = Crv;
}
}
fclose(f);
return CrvList;
}
/******************************************************************************
* Reads and returns a bezier curve. *
* If NameWasRead is TRUE, it is assumed prefix "[CURVE BEZIER" has already *
* been read. This is useful for a global parser which invokes this routine. *
* For exactly this reason, the file is NOT closed in the end. *
* If error is found in reading the file, ErrStr is set to string describing *
* it and ErrLine to line it occured in file relative to begining of curve. *
* If no error is detected *ErrStr is set to NULL. *
******************************************************************************/
CagdCrvStruct *BzrCrvReadFromFile2(FILE *f, CagdBType NameWasRead,
char **ErrStr, int *ErrLine)
{
CagdPointType PType;
TokenNumType Token;
int i, j, Length, MaxCoord;
char StringToken[LINE_LEN];
CagdCrvStruct *NewCrv;
_CagdGlblLineCount = *ErrLine;
if (!NameWasRead) {
while ((Token = _CagdGetToken(f, StringToken)) != TOKEN_EOF &&
Token != TOKEN_OPEN_PAREN);
/* We found beginning of definition - read one: */
if (_CagdGetToken(f, StringToken) != TOKEN_CURVE ||
_CagdGetToken(f, StringToken) != TOKEN_BEZIER) {
*ErrStr = "CURVE BEZIER key words expected";
*ErrLine = _CagdGlblLineCount;
return NULL;
}
}
if ((Token = _CagdGetToken(f, StringToken)) == TOKEN_OPEN_PAREN) {
if ((*ErrStr = _CagdGetCurveAttributes(f)) != NULL) {
*ErrStr = "\"[\" expected";
*ErrLine = _CagdGlblLineCount;
return NULL;
}
}
else
_CagdUnGetToken(StringToken);
if ((Token = _CagdGetToken(f, StringToken)) != TOKEN_OTHER ||
sscanf(StringToken, "%d", &Length) != 1) {
*ErrStr = "BEZIER Number of points expected";
*ErrLine = _CagdGlblLineCount;
return NULL;
}
if ((Token = _CagdGetToken(f, StringToken)) != TOKEN_OTHER ||
strlen(StringToken) != 2 ||
(StringToken[0] != 'E' && StringToken[0] != 'P') ||
!isdigit(StringToken[1]) ||
atoi(&StringToken[1]) >= CAGD_MAX_PT_COORD) {
*ErrStr = "BEZIER Point type expected";
*ErrLine = _CagdGlblLineCount;
return NULL;
}
PType = CAGD_MAKE_PT_TYPE(StringToken[0] == 'P', atoi(&StringToken[1]));
NewCrv = BzrCrvNew(Length, PType);
/* Read the points themselves: */
MaxCoord = CAGD_NUM_OF_PT_COORD(PType);
for (i = 0; i < Length; i++) {
if ((Token = _CagdGetToken(f, StringToken)) != TOKEN_OPEN_PAREN) {
*ErrStr = "\"[\" expected";
*ErrLine = _CagdGlblLineCount;
CagdCrvFree(NewCrv);
return NULL;
}
if (CAGD_IS_RATIONAL_PT(PType)) {
if ((Token = _CagdGetToken(f, StringToken)) != TOKEN_OTHER ||
#ifdef CAGD_DOUBLE
sscanf(StringToken, "%lf", &NewCrv -> Points[W][i]) != 1) {
#else
sscanf(StringToken, "%f", &NewCrv -> Points[W][i]) != 1) {
#endif /* CAGD_DOUBLE */
*ErrStr = "Numeric data expected";
*ErrLine = _CagdGlblLineCount;
CagdCrvFree(NewCrv);
return NULL;
}
}
for (j = 1; j <= MaxCoord; j++) {
if ((Token = _CagdGetToken(f, StringToken)) != TOKEN_OTHER ||
#ifdef CAGD_DOUBLE
sscanf(StringToken, "%lf", &NewCrv -> Points[j][i]) != 1) {
#else
sscanf(StringToken, "%f", &NewCrv -> Points[j][i]) != 1) {
#endif /* CAGD_DOUBLE */
*ErrStr = "Numeric data expected";
*ErrLine = _CagdGlblLineCount;
CagdCrvFree(NewCrv);
return NULL;
}
}
if ((Token = _CagdGetToken(f, StringToken)) != TOKEN_CLOSE_PAREN) {
*ErrStr = "\"]\" expected";
*ErrLine = _CagdGlblLineCount;
CagdCrvFree(NewCrv);
return NULL;
}
}
if ((Token = _CagdGetToken(f, StringToken)) != TOKEN_CLOSE_PAREN) {
*ErrStr = "\"]\" expected";
*ErrLine = _CagdGlblLineCount;
CagdCrvFree(NewCrv);
return NULL;
}
*ErrLine = _CagdGlblLineCount;
*ErrStr = NULL;
return NewCrv;
}
/******************************************************************************
* Reads and returns a bezier surface. *
* If error is found in reading the file, ErrStr is set to string describing *
* it and ErrLine to the line it occured in file. *
* If no error is detected *ErrStr = NULL. *
******************************************************************************/
CagdSrfStruct *BzrSrfReadFromFile(char *FileName, char **ErrStr, int *ErrLine)
{
FILE *f;
char StringToken[LINE_LEN];
CagdSrfStruct *Srf,
*SrfTail = NULL,
*SrfList = NULL;
if ((f = fopen(FileName, "r")) == NULL) {
*ErrStr = "File not found";
return NULL;
}
while (_CagdGetToken(f, StringToken) == TOKEN_OPEN_PAREN) {
_CagdUnGetToken(StringToken);
Srf = BzrSrfReadFromFile2(f, FALSE, ErrStr, ErrLine);
if (SrfList == NULL)
SrfList = SrfTail = Srf;
else {
SrfTail -> Pnext = Srf;
SrfTail = Srf;
}
}
fclose(f);
return SrfList;
}
/******************************************************************************
* Reads and returns a bezier surface. *
* If NameWasRead is TRUE, it is assumed prefix "[SURFACE BEZIER" has already *
* been read. This is useful for a global parser which invokes this routine. *
* For exactly this reason, the file is NOT closed in the end. *
* If error is found in reading the file, ErrStr is set to string describing *
* it and ErrLine to the line it occured in file. *
* If no error is detected *ErrStr = NULL. *
******************************************************************************/
CagdSrfStruct *BzrSrfReadFromFile2(FILE *f, CagdBType NameWasRead,
char **ErrStr, int *ErrLine)
{
CagdPointType PType;
TokenNumType Token;
int i, j, ULength, VLength, MaxCoord;
char StringToken[LINE_LEN];
CagdSrfStruct *NewSrf;
_CagdGlblLineCount = *ErrLine;
if (!NameWasRead) {
while ((Token = _CagdGetToken(f, StringToken)) != TOKEN_EOF &&
Token != TOKEN_OPEN_PAREN);
/* We found beginning of definition - read one: */
if (_CagdGetToken(f, StringToken) != TOKEN_SURFACE ||
_CagdGetToken(f, StringToken) != TOKEN_BEZIER) {
*ErrStr = "SURFACE BEZIER key words expected";
*ErrLine = _CagdGlblLineCount;
return NULL;
}
}
if ((Token = _CagdGetToken(f, StringToken)) == TOKEN_OPEN_PAREN) {
if ((*ErrStr = _CagdGetSurfaceAttributes(f)) != NULL) {
*ErrStr = "\"[\" expected";
*ErrLine = _CagdGlblLineCount;
return NULL;
}
}
else
_CagdUnGetToken(StringToken);
if ((Token = _CagdGetToken(f, StringToken)) != TOKEN_OTHER ||
sscanf(StringToken, "%d", &ULength) != 1 ||
(Token = _CagdGetToken(f, StringToken)) != TOKEN_OTHER ||
sscanf(StringToken, "%d", &VLength) != 1) {
*ErrStr = "BEZIER Number of points expected";
*ErrLine = _CagdGlblLineCount;
return NULL;
}
if ((Token = _CagdGetToken(f, StringToken)) != TOKEN_OTHER ||
strlen(StringToken) != 2 ||
(StringToken[0] != 'E' && StringToken[0] != 'P') ||
!isdigit(StringToken[1]) ||
atoi(&StringToken[1]) >= CAGD_MAX_PT_COORD) {
*ErrStr = "BEZIER Point type expected";
*ErrLine = _CagdGlblLineCount;
return NULL;
}
PType = CAGD_MAKE_PT_TYPE(StringToken[0] == 'P', atoi(&StringToken[1]));
NewSrf = BzrSrfNew(ULength, VLength, PType);
/* Read the points themselves: */
MaxCoord = CAGD_NUM_OF_PT_COORD(PType);
for (i = 0; i < ULength * VLength; i++) {
if ((Token = _CagdGetToken(f, StringToken)) != TOKEN_OPEN_PAREN) {
*ErrStr = "\"[\" expected";
*ErrLine = _CagdGlblLineCount;
CagdSrfFree(NewSrf);
return NULL;
}
if (CAGD_IS_RATIONAL_PT(PType)) {
if ((Token = _CagdGetToken(f, StringToken)) != TOKEN_OTHER ||
#ifdef CAGD_DOUBLE
sscanf(StringToken, "%lf", &NewSrf -> Points[W][i]) != 1) {
#else
sscanf(StringToken, "%f", &NewSrf -> Points[W][i]) != 1) {
#endif /* CAGD_DOUBLE */
*ErrStr = "Numeric data expected";
*ErrLine = _CagdGlblLineCount;
CagdSrfFree(NewSrf);
return NULL;
}
}
for (j = 1; j <= MaxCoord; j++) {
if ((Token = _CagdGetToken(f, StringToken)) != TOKEN_OTHER ||
#ifdef CAGD_DOUBLE
sscanf(StringToken, "%lf", &NewSrf -> Points[j][i]) != 1) {
#else
sscanf(StringToken, "%f", &NewSrf -> Points[j][i]) != 1) {
#endif /* CAGD_DOUBLE */
*ErrStr = "Numeric data expected";
*ErrLine = _CagdGlblLineCount;
CagdSrfFree(NewSrf);
return NULL;
}
}
if ((Token = _CagdGetToken(f, StringToken)) != TOKEN_CLOSE_PAREN) {
*ErrStr = "\"]\" expected";
*ErrLine = _CagdGlblLineCount;
CagdSrfFree(NewSrf);
return NULL;
}
}
if ((Token = _CagdGetToken(f, StringToken)) != TOKEN_CLOSE_PAREN) {
*ErrStr = "\"]\" expected";
*ErrLine = _CagdGlblLineCount;
CagdSrfFree(NewSrf);
return NULL;
}
*ErrStr = NULL;
*ErrLine = _CagdGlblLineCount;
return NewSrf;
}