📄 attrlist.c
字号:
/* ======================================================================== DEVise Data Visualization Software (c) Copyright 1992-1996 By the DEVise Development Group Madison, Wisconsin All Rights Reserved. ======================================================================== Under no circumstances is this software to be copied, distributed, or altered in any way without prior permission from the DEVise Development Group.*//* $Id: AttrList.c,v 1.10 1996/09/27 15:52:33 wenger Exp $ $Log: AttrList.c,v $ Revision 1.10 1996/09/27 15:52:33 wenger Fixed a number of memory leaks. Revision 1.9 1996/07/23 20:12:39 wenger Preliminary version of code to save TData (schema(s) and data) to a file. Revision 1.8 1996/05/07 16:14:19 jussi Added copy constructor and GetVal() method. Revision 1.7 1996/01/10 00:38:16 jussi Minor changes. Revision 1.6 1995/12/20 07:04:08 ravim High and low values of attrs can be specified. Revision 1.5 1995/12/13 18:42:43 jussi Now iterator works even if attribute list has holes i.e. list is non-contiguous. Revision 1.4 1995/11/21 21:10:43 jussi Added copyright notice and cleaned up a bit. Revision 1.3 1995/09/05 21:12:22 jussi Added/updated CVS header. Revision 1.2 1995/09/05 20:39:21 jussi Added CVS header.*/#include <stdio.h>#include <unistd.h>#include "AttrList.h"#include "Util.h"static char *GetTypeString(AttrType type);static void WriteVal(int fd, AttrVal *aval, AttrType atype);AttrList::AttrList(char *name){ for(int i = 0; i < MAX_ATTRLIST_SIZE; i++) _attrs[i] = NULL; _size = 0; _name = name;}AttrList::~AttrList(){ for(int i = 0; i < _size; i++) { if (_attrs[i] != NULL) delete _attrs[i]; }}/* Copy constructor */AttrList::AttrList(AttrList &attrs){ for(int i = 0; i < MAX_ATTRLIST_SIZE; i++) _attrs[i] = NULL; _size = 0; _name = CopyString(attrs.GetName()); /* copy attributes from attrs to this list */ attrs.InitIterator(); while(attrs.More()) { AttrInfo *info = attrs.Next(); InsertAttr(info->attrNum, info->name, info->offset, info->length, info->type, info->hasMatchVal, &info->matchVal, info->isComposite, info->isSorted, info->hasHiVal, &info->hiVal, info->hasLoVal, &info->loVal); } attrs.DoneIterator();}/* Insert attribute into list of attributes */void AttrList::InsertAttr(int attrNum, char *name, int offset, int length, AttrType type, Boolean hasMatchVal, AttrVal *matchVal, Boolean isComposite, Boolean isSorted, Boolean hasHiVal, AttrVal *hiVal, Boolean hasLoVal, AttrVal *loVal){ if (attrNum < 0 || attrNum >= MAX_ATTRLIST_SIZE) { fprintf(stderr,"AttrList::InsertAttr: invalid attrNum %d\n", attrNum); Exit::DoExit(1); } if (_attrs[attrNum] != NULL) { fprintf(stderr,"AttrList::InsertAttr: attrNum %d already exists\n", attrNum); Exit::DoExit(1); } AttrInfo *info = new AttrInfo; info->attrNum = attrNum; info->name = CopyString(name); info->offset = offset; info->length = length; info->type = type; info->hasMatchVal = hasMatchVal; if (hasMatchVal) info->matchVal = *matchVal; info->isComposite = isComposite; info->isSorted = isSorted; info->hasHiVal = hasHiVal; if (hasHiVal) info->hiVal = *hiVal; info->hasLoVal = hasLoVal; if (hasLoVal) info->loVal = *loVal; if (_size < attrNum+1) _size = attrNum+1; _attrs[attrNum] = info;}void AttrList::InitIterator(){ _index = 0;}Boolean AttrList::More(){ return (_index < _size);}AttrInfo *AttrList::Next(){ AttrInfo *info; do { info = _attrs[_index]; _index++; } while (!info && _index < _size); return info;}void AttrList::DoneIterator(){}AttrInfo *AttrList::Find(char *name){ for(int index = 0; index < _size; index++) { AttrInfo *info = _attrs[index]; if (info && !strcmp(info->name, name)) return info; } return NULL;}AttrInfo *AttrList::Get(int n){ if (n < 0 || n >= _size) { fprintf(stderr, "AttrList::Get(%d): %d existing attrs\n", n, _size); Exit::DoExit(2); } return _attrs[n];}double AttrList::GetVal(AttrVal *aval, AttrType atype){ switch(atype) { case IntAttr: return aval->intVal; case FloatAttr: return aval->floatVal; break; case DoubleAttr: return aval->doubleVal; case StringAttr: DOASSERT(0, "Cannot get value of string attribute"); break; case DateAttr: return aval->dateVal; default: DOASSERT(0, "Unknown attribute type"); break; } /* make compiler happy */ return -1;}void AttrList::Print(){ printf("AttrList:\n"); for (InitIterator(); More(); ){ AttrInfo *info = Next(); printf(" name %s, num %d, offset %d, length %d, composite %d, ", info->name, info->attrNum, info->offset, info->length, (info->isComposite? 1 : 0)); printf("%s", GetTypeString(info->type)); if (info->hasHiVal) { printf(", hi "); PrintVal(&(info->hiVal), info->type); } if (info->hasLoVal) { printf(", lo "); PrintVal(&(info->loVal), info->type); } printf("\n"); } DoneIterator();}void AttrList::Write(int fd){ for (InitIterator(); More(); ) { AttrInfo *infoP = Next(); char *string; // Sorted? if (infoP->isSorted) { string = "sorted "; write (fd, string, strlen(string)); } // Composite or normal attribute? if (infoP->isComposite) { string = "compattr "; } else { string = "attr "; } write (fd, string, strlen(string)); // Name. write (fd, infoP->name, strlen(infoP->name)); write (fd, " ", 1); // Type. string = GetTypeString(infoP->type); write (fd, string, strlen(string)); write (fd, " ", 1); // Length. if (infoP->type == StringAttr) { char buf[100]; sprintf(buf, "%d ", infoP->length); write (fd, buf, strlen(buf)); } // Match value. TEMPTEMP -- before or after length?? if (infoP->hasMatchVal) { string = "= "; write (fd, string, strlen(string)); WriteVal(fd, &infoP->matchVal, infoP->type); } // Hi. if (infoP->hasHiVal) { string = "hi "; write (fd, string, strlen(string)); WriteVal(fd, &infoP->hiVal, infoP->type); } // Lo. if (infoP->hasLoVal) { string = "lo "; write (fd, string, strlen(string)); WriteVal(fd, &infoP->loVal, infoP->type); } write (fd, "\n", 1); } DoneIterator();}void AttrList::PrintVal(AttrVal *aval, AttrType atype){ switch(atype) { case IntAttr: printf(" %d ", aval->intVal); break; case FloatAttr: printf(" %f ", aval->floatVal); break; case DoubleAttr: printf(" %f ", aval->doubleVal); break; case StringAttr: printf(" %s ", aval->strVal); break; case DateAttr: printf(" %ld ", (long)aval->dateVal); break; default: break; }}static char *GetTypeString(AttrType type){ switch(type) { case IntAttr: return "int"; break; case FloatAttr: return "float"; break; case DoubleAttr: return "double"; break; case StringAttr: return "string"; break; case DateAttr: return "date"; break; default: DOASSERT(0, "Unknown attribute type"); return ""; // So compiler is happy. break; }}static voidWriteVal(int fd, AttrVal *aval, AttrType atype){ char buf[100]; switch(atype) { case IntAttr: sprintf(buf, "%d ", aval->intVal); break; case FloatAttr: sprintf(buf, "%f ", aval->floatVal); break; case DoubleAttr: sprintf(buf, "%f ", aval->doubleVal); break; case StringAttr: sprintf(buf, "%s ", aval->strVal); break; case DateAttr: sprintf(buf, "%ld ", (long)aval->dateVal);//TEMPTEMP? break; default: DOASSERT(0, "Unknown attribute type"); break; } write (fd, buf, strlen(buf)); return;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -