home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
OS/2 Professional
/
OS2PRO194.ISO
/
os2
/
graphic
/
qrt
/
patterni.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-03-26
|
6KB
|
266 lines
/**********************************************************
This module loads patterns and sub-patterns for the
inout.c file, which was getting inconvienently big.
**********************************************************/
#include "qrt.h"
#include "pattern.h"
char *Get_Next_Name();
float Get_Next_Num(), IsPos();
/**********************************************************
Attaches a pattern pointer to an object given
pattern name.
**********************************************************/
PATTERN_PTR Attach_Pattern()
{
char *patname;
PATTERN_PTR find_pat(), pat;
patname=Get_Next_Name();
pat = find_pat(patname);
if (pat==NULL) Error(PATTERN_NOT_FOUND,1101);
free(patname);
return(pat);
}
/**********************************************************
Load a circle sub-pattern and return pointer to it
**********************************************************/
PATTERN_PTR Get_Circle_Pattern()
{
char str[SLEN];
int end, f, found;
PATTERN_PTR pattern, new_pat();
CINFO cinfo;
end=f=0;
pattern=new_pat();
pattern->type = CIRCLE_PATTERN;
def_colorinfo(&cinfo);
GetLeftParen();
while (!end && !feof(stdin)) {
GetToken(str); found = TRUE;
if (strcmp(str,",")!=0) {
found = GetOpt(str,&cinfo);
if (strcmp(str,"RADIUS")==0) {
pattern->radius = IsPos(Get_Next_Num());
f|=1; found = TRUE;
}
if (strcmp(str,")")==0) { end=1; found = TRUE; }
}
if (!found) Error(UNDEFINED_PARAM,1102);
}
if (f!=1) Error(TOO_FEW_PARMS,1103);
copy_colorinfo(&(pattern->cinfo),&cinfo);
return(pattern);
}
/**********************************************************
Load a rectangle sub-pattern and return pointer to it
**********************************************************/
PATTERN_PTR Get_Rect_Pattern()
{
char str[SLEN];
int end, f, found;
PATTERN_PTR pattern, new_pat();
CINFO cinfo;
end=f=0;
pattern=new_pat();
pattern->type = RECT_PATTERN;
def_colorinfo(&cinfo);
GetLeftParen();
while (!end && !feof(stdin)) {
GetToken(str); found = TRUE;
if (strcmp(str,",")!=0) {
found = GetOpt(str,&cinfo);
if (strcmp(str,"START_X")==0) {
pattern->startx=Get_Next_Num();
f|=1; found = TRUE;
}
if (strcmp(str,"START_Y")==0) {
pattern->starty=Get_Next_Num();
f|=2; found = TRUE;
}
if (strcmp(str,"END_X")==0) {
pattern->endx=Get_Next_Num();
f|=4; found = TRUE;
}
if (strcmp(str,"END_Y")==0) {
pattern->endy=Get_Next_Num();
f|=8; found = TRUE;
}
if (strcmp(str,")")==0) { end=1; found = TRUE; }
}
if (!found) Error(UNDEFINED_PARAM,1104);
}
if (f!=15) Error(TOO_FEW_PARMS,1105);
copy_colorinfo(&(pattern->cinfo),&cinfo);
return(pattern);
}
/**********************************************************
Load a polygon sub-pattern and return pointer to it
**********************************************************/
PATTERN_PTR Get_Poly_Pattern()
{
char str[SLEN];
int end, f, found;
PATTERN_PTR pattern, pointpatt, new_pat();
CINFO cinfo;
end=f=0;
pattern=new_pat();
pattern->type = POLY_PATTERN;
def_colorinfo(&cinfo);
GetLeftParen();
while (!end && !feof(stdin)) {
GetToken(str); found = TRUE;
if (strcmp(str,",")!=0) {
found = GetOpt(str,&cinfo);
if (strcmp(str,"POINT")==0) {
GetLeftParen();
pointpatt = new_pat();
pointpatt->startx = Get_Next_Num();
pointpatt->starty = Get_Next_Num();
f+=1; found = TRUE;
GetToken(str);
if (strcmp(str,")") != 0) {
Error(RPAREN_EXPECTED,1106);
}
str[0] = '\0'; /* clear str */
pointpatt->link = pattern->link;
pattern->link = pointpatt;
}
if (strcmp(str,")")==0) { end=1; found = TRUE; }
}
if (!found) Error(UNDEFINED_PARAM,1107);
}
if (f<3) Error(TOO_FEW_PARMS,1108);
copy_colorinfo(&(pattern->cinfo),&cinfo);
return(pattern);
}
/**********************************************************
Load a sub-pattern and return a pointer to it,
or null if not found.
**********************************************************/
PATTERN_PTR Get_SubPattern(str)
char *str;
{
if (strcmp(str,"RECTANGLE")==0)
return(Get_Rect_Pattern());
if (strcmp(str,"CIRCLE")==0)
return(Get_Circle_Pattern());
if (strcmp(str,"POLYGON")==0)
return(Get_Poly_Pattern());
return(NULL);
}
/**********************************************************
Load pattern and attach it to pattern list
**********************************************************/
int GetPattern()
{
char str[SLEN];
int end, f, found;
PATTERN_PTR pattern, spat, new_pat();
end=f=0;
GetLeftParen();
pattern = new_pat();
pattern->type = PATT_HEADER;
while (!end && !feof(stdin)) {
GetToken(str); found = TRUE;
if (strcmp(str,",")!=0) {
found = FALSE;
if (strcmp(str,"X_SIZE")==0) {
pattern->xsize=Get_Next_Num();
f|=1; found = TRUE;
}
if (strcmp(str,"Y_SIZE")==0) {
pattern->ysize=Get_Next_Num();
f|=2; found = TRUE;
}
if (strcmp(str,"NAME")==0) {
pattern->name=Get_Next_Name();
f|=4; found = TRUE;
}
if ((spat=Get_SubPattern(str))!=NULL) {
spat->sibling=pattern->child;
pattern->child=spat;
f|=8; found = TRUE;
}
if (strcmp(str,")")==0) { end=1; found = TRUE; }
}
if (!found) Error(UNDEFINED_PARAM,1109);
}
if (f!=15) Error(TOO_FEW_PARMS,1110);
pattern->sibling=THEWORLD.patlist;
THEWORLD.patlist=pattern;
return(TRUE);
}