📄 apparsecat.c
字号:
Boolean hasSeparator = false;
Boolean hasWhitespace = false;
Boolean hasComment = false;
Boolean isAscii = false;
Boolean GLoad = true;
char *fileType = 0;
int numArgs;
char **args;
int recSize = 0;
char *sep = 0;
int numSep = 0;
char *commentString = 0;
Group *currgrp = NULL;
#if 0
if (attrs != NULL) delete attrs;
#endif
attrs = NULL;
numAttrs = 0;
/*
printf("opening file %s\n", catFile);
*/
file = fopen(catFile, "r");
if (file == NULL){
fprintf(stderr,"ParseCat: can't open file %s\n", catFile);
goto error;
}
_line = 0;
while ((fgets(buf,LINESIZE, file) != NULL) && strcmp(buf, "endSchema\n"))
{
StripTrailingNewline(buf);
_line++;
/*
printf("getting line %s\n", buf);
*/
if (buf[0] == '#' || buf[0] == '\n' || buf[0] == '\r')
continue;
Parse(buf,numArgs, args);
if (numArgs == 0)
continue;
#ifdef DEBUG
printf("parse: ");
for(int ind = 0; ind < numArgs; ind++)
printf("'%s' ", args[ind]);
printf("\n");
#endif
if (strcmp(args[0],"end")== 0)
{
break;
}
else if (strcmp(args[0],"source") == 0)
{
source = CopyString(args[1]);
hasSource = true;
}
else if (strcmp(args[0],"separator")== 0)
{
/* parse separator */
hasSeparator = ParseSeparator(numArgs, args);
if (!hasSeparator){
fprintf(stderr,"can't parse separator\n");
goto error;
}
}
else if (strcmp(args[0],"whitespace")== 0)
{
/* parse separator */
hasWhitespace = ParseWhiteSpace(numArgs, args);
}
else if (strcmp(args[0],"comment") == 0)
{
if (numArgs != 2){
fprintf(stderr,"can't parse comment string\n");
goto error;
}
hasComment = true;
commentString = CopyString(args[1]);
}
else if (strcmp(args[0],"type") == 0)
{
if (numArgs != 3)
{
fprintf(stderr,"can't parse file type need 3 args\n");
goto error;
}
if (strcmp(args[2],"ascii") == 0)
{
isAscii = true;
}
else if (strcmp(args[2],"binary") == 0)
{
isAscii = false;
}
else
{
fprintf(stderr,"don't know file type %s, must be ascii or binary", args[2]);
goto error;
}
fileType = CopyString(args[1]);
hasFileType = true;
if (physicalOnly)
{
/* Let's add the schema name to the directory now */
/* First check if the schema is already loaded, in
which case we do nothing more */
if (gdir->find_entry(StripPath(catFile)))
{
GLoad = false;
}
else
{
#ifdef DEBUG
printf("Adding schema %s to directory\n", StripPath(catFile));
#endif
gdir->add_entry(StripPath(catFile));
GLoad = true;
}
}
}
else if (strcmp(args[0],"attr") == 0 ||
strcmp(args[0],"compattr") == 0 ||
strcmp(args[0],"sorted") == 0)
{
if (ParseAttr(numArgs, args, recSize, hasFileType, fileType) !=
StatusOk) goto error;
}
else if (physicalOnly && !strcmp(args[0], "group"))
{
if (GLoad) {
if (!currgrp) /* Top level */
{
currgrp = new Group(args[1], NULL, TOPGRP);
gdir->add_topgrp(StripPath(catFile), currgrp);
}
else
currgrp = currgrp->insert_group(args[1]);
}
}
else if (physicalOnly && !strcmp(args[0], "item"))
{
if (GLoad)
{
currgrp->insert_item(args[1]);
}
}
else if (physicalOnly && !strcmp(args[0], "endgroup"))
{
if (GLoad)
{
if (!currgrp)
{
fprintf(stderr, "Group begins and ends not matched\n");
goto error;
}
currgrp = currgrp->parent_group();
}
}
else
{
fprintf(stderr,"ParseCat: unknown command %s\n", args[0]);
goto error;
}
}
/* round record size */
if (recSize/8*8 != recSize){
/* round to rounding boundaries */
recSize = (recSize/8+1)*8;
}
if (!hasFileType ){
fprintf(stderr,"ParseCat: no file type specified\n");
goto error;
}
if (numAttrs == 0){
fprintf(stderr,"ParseCat: no attribute specified\n");
goto error;
}
int i,j;
if (physicalOnly)
{
/* If no group has been defined, create a default group */
if (GLoad && (gdir->num_topgrp(StripPath(catFile)) == 0))
{
Group *newgrp = new Group("__default", NULL, TOPGRP);
gdir->add_topgrp(StripPath(catFile), newgrp);
for (i=0; i < numAttrs; i++) {
AttrInfo *iInfo = attrs->Get(i);
if (iInfo->type != StringAttr)
newgrp->insert_item(iInfo->name);
}
}
}
/* test attribute names */
for (i=0 ; i < numAttrs-1;i++) {
AttrInfo *iInfo = attrs->Get(i);
if (strcmp(iInfo->name,"recId") == 0){
fprintf(stderr,"attribute name 'recId' is reserved\n");
goto error;
}
for (j=i+1; j < numAttrs; j++){
AttrInfo *jInfo = attrs->Get(j);
if (strcmp(iInfo->name,jInfo->name)== 0){
fprintf(stderr,"ParseCat:duplicate attribute name %s\n",
iInfo->name);
goto error;
}
}
}
if (isAscii) {
if (hasSeparator && hasWhitespace){
fprintf(stderr,"can't specify both whitespace and separator\n");
goto error;
}
if (!(hasSeparator || hasWhitespace)){
fprintf(stderr,"must specify either whitespace or separator\n");
goto error;
}
}
if (hasSeparator) {
sep = new char[numSeparators];
for (i=0; i < numSeparators; i++){
sep[i] = separators[i];
}
numSep = numSeparators;
}
if (hasWhitespace) {
sep = new char[numWhitespace];
for (i=0; i < numWhitespace; i++){
sep[i] = whitespaces[i];
}
numSep = numWhitespace;
}
if (!hasComment)
commentString = "#";
if (hasSource)
{
#ifndef NO_GEN_CLASS_INFO
if (physicalOnly)
{
printf("source: %s\n",source);
}
else
{
printf("schema: %s\n",source);
}
GenClassInfo *genInfo = FindGenClass(source);
ControlPanel::RegisterClass(
genInfo->Gen(source, isAscii, fileType,
attrs, recSize,sep, numSep, hasSeparator, commentString),
true);
#else
fprintf(stderr, "Illegal token 'source' in schema\n");
Exit::DoExit(1);
#endif
}
else
{
// strdups because TData destructor will try to free type
// strings -- make sure they're dynamic.
if (isAscii) {
#ifdef DEBUG
printf("default source, recSize %d\n",recSize);
#endif
tDataP = new TDataAsciiInterp(catFile, strdup("UNIXFILE"), dataFile,
recSize, attrs, sep, numSep, hasSeparator, commentString);
}
else
{
#ifdef DEBUG
printf("default binary source, recSize %d\n",recSize);
#endif
// Note: the second use of recSize is for the physical
// record size. This needs to get changed. RKW 96/06/27.
tDataP = new TDataBinaryInterp(catFile, strdup("UNIXFILE"), dataFile,
recSize, recSize/*TEMP*/, attrs);
}
}
fclose(file);
if (Init::PrintTDataAttr()) attrs->Print();
return fileType;
error:
if (file != NULL) fclose(file);
if (attrs != NULL) delete attrs;
fprintf(stderr,"error at line %d\n", _line);
return NULL;
}
/*------------------------------------------------------------------------------
* function: ParseCatLogical
* Read and parse a logical schema from a catalog file.
*/
static char *
ParseCatLogical(char *catFile, char *sname)
{
Group *currgrp = NULL;
FILE *file= NULL;
Boolean GLoad = true;
char buf[LINESIZE];
int numArgs;
char **args;
file = fopen(catFile, "r");
if (file == NULL) {
fprintf(stderr,"ParseCat: can't open file %s\n", catFile);
goto error;
}
_line = 0;
/* read the first line first */
fgets(buf, LINESIZE, file);
/* Let's add the group name to the directory now */
/* The groups for a particular logical schema are identified by the
schema file name. This is bcos the type name of the physical schema
is not a unique identifier - several logical schemas may use the same
physical schema */
/* First check if the schema is already loaded, in
which case we do nothing more */
if (gdir->find_entry(StripPath(catFile)))
GLoad = false;
else
{
printf("Adding schema %s to directory \n", StripPath(catFile));
gdir->add_entry(StripPath(catFile));
GLoad = true;
}
while (fgets(buf,LINESIZE, file) != NULL) {
StripTrailingNewline(buf);
_line++;
/*
printf("getting line %s\n", buf);
*/
if (buf[0] == '#' || buf[0] == '\n' || buf[0] == '\r')
continue;
Parse(buf,numArgs, args);
if (numArgs == 0)
continue;
#ifdef DEBUG
printf("parse: ");
for(int ind = 0; ind < numArgs; ind++)
printf("'%s' ", args[ind]);
printf("\n");
#endif
if (strcmp(args[0], "group") == 0)
{
if (GLoad) {
if (!currgrp) /* Top level */
{
currgrp = new Group(args[1], NULL, TOPGRP);
gdir->add_topgrp(StripPath(catFile), currgrp);
}
else
currgrp = currgrp->insert_group(args[1]);
}
}
else if (strcmp(args[0], "item") == 0)
{
if (GLoad) {
currgrp->insert_item(args[1]);
}
}
else if (strcmp(args[0], "endgroup") == 0)
{
if (GLoad) {
if (!currgrp)
{
fprintf(stderr, "Group begins and ends not matched\n");
goto error;
}
currgrp = currgrp->parent_group();
}
}
else {
fprintf(stderr,"ParseCat: unknown command %s\n", args[0]);
goto error;
}
}
/* If no group has been defined, create a default group */
if (GLoad && (gdir->num_topgrp(StripPath(catFile)) == 0))
{
Group *newgrp = new Group("__default", NULL, TOPGRP);
gdir->add_topgrp(StripPath(catFile), newgrp);
for(int i = 0; i < numAttrs; i++) {
AttrInfo *iInfo = attrs->Get(i);
if (iInfo->type != StringAttr)
newgrp->insert_item(iInfo->name);
}
}
fclose(file);
return sname;
error:
if (file != NULL)
fclose(file);
fprintf(stderr,"error at line %d\n", _line);
return NULL;
}
/*------------------------------------------------------------------------------
* function: ApParseCat
* Read and parse a schema file.
*/
char *
ApParseCat(char *catFile, char *dataFile, TData *&tDataP)
{
// Check the first line of catFile - if it is "physical abc",
// call ParseCatPhysical(abc, false) and then ParseCatLogical(catFile)
// Otherwise, simply call ParseCatPhysical(catFile, true).
char * result = NULL;
FILE *fp = fopen(catFile, "r");
if (!fp)
{
fprintf(stderr,"ParseCat: can't open file %s\n", catFile);
}
else
{
char buf[100];
if (fscanf(fp, "%s", buf) != 1 || strcmp(buf, "physical"))
{
fclose(fp);
result = ParseCatPhysical(catFile, dataFile, true, tDataP);
}
else
{
// Read in the file name
fscanf(fp, "%s", buf);
fclose(fp);
char *sname;
if (!(sname = ParseCatPhysical(buf, dataFile, false, tDataP)))
{
result = NULL;
}
result = ParseCatLogical(catFile, sname);
}
}
return result;
}
/*------------------------------------------------------------------------------
* function: ApParseSchema
* Parse a schema from buffer(s).
*/
char *
ApParseSchema(char *schemaName, char *physSchema, char *logSchema)
{
char * result = NULL;
return result;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -