示例#1
0
/*----------------------------------------------------------------------------*/
void XmlParser::cargarArista(Mapa* mapa,xmlpp::TextReader& reader,int arcoId,string orientacion)
{
	int idVerticeOrig=0;
	int idVerticeDest=0;

	readElement(reader,VERTICE);
	idVerticeOrig = getAtributoInt(reader,ATRIB_ID);
	readElement(reader,VERTICE);
	idVerticeDest = getAtributoInt(reader,ATRIB_ID);
	
	cargarPasillo(mapa,arcoId,orientacion,idVerticeOrig,idVerticeDest);
}
示例#2
0
文件: file.c 项目: grasmanek94/prc22
int computeAverageStudyResults(char* FileName, double* Average)
/* pre    :
* post   : Calculates the average of all study results in a file
* returns: -1 if an error occurs, 0 if a valid average is computed
*/
{
	FILE* fptr = fopen(FileName, "rb");
	if (fptr == NULL || Average == NULL || FileName == NULL)
	{
		return -1;
	}

	int sum = 0;
	int index = 0;
	STUDENT student;

	while (readElement(fptr, index++, &student))
	{
		sum += student.StudyCredits;
	}

	if (index == 1)
	{
		return -1;
	}

	*Average = (double)sum / (double)--index;

	fclose(fptr);

	return 0;
}
示例#3
0
bool DeckList::loadFromXml(QXmlStreamReader *xml)
{
    if (xml->error()) {
        qDebug() << "Error loading deck from xml: " << xml->errorString();
        return false;
    }

	cleanList();
	while (!xml->atEnd()) {
		xml->readNext();
		if (xml->isStartElement()) {
			if (xml->name() != "cockatrice_deck")
				return false;
			while (!xml->atEnd()) {
				xml->readNext();
				if (!readElement(xml))
					break;
			}
		}
	}
	updateDeckHash();
    if (xml->error()) {
        qDebug() << "Error loading deck from xml: " << xml->errorString();
        return false;
    }
	return true;
}
示例#4
0
/**
 * @brief Reads an object from `reader`. An object is a valid JSON structure.
 * @param reader The JSONReader.
 * @return The object.
 */
static Dictionary *readObject(JSONReader *reader) {

	MutableDictionary *object = $(alloc(MutableDictionary), init);

	while (true) {

		String *key = readLabel(reader);
		if (key == NULL) {
			const int b = readByteUntil(reader, "}");
			assert(b == '}');
			break;
		}

		const int b = readByteUntil(reader, ":");
		assert(b == ':');

		ident obj = readElement(reader);
		assert(obj);

		$(object, setObjectForKey, obj, key);

		release(key);
		release(obj);
	}

	return (Dictionary *) object;
}
示例#5
0
QDomElement XMLConfigDocument::readElement(const QDomElement &baseElem, const QString &name) const
{
  QDomElement result;
  QString curElemName;
  
  int separator_count = name.count(SEPARATOR);
  
  if( separator_count <= 0)
    curElemName = name;
  else
    curElemName = name.section(SEPARATOR, 0, 0);
  
  QDomNode n = baseElem.firstChildElement(curElemName);
  if(!n.isNull()) 
  {
    result = n.toElement();
    
    if( separator_count > 0 )
    {
      QString changedName = name.section(SEPARATOR, 1, name.count(SEPARATOR));
   
      result = readElement(result, changedName);
    }
  }
  
  return result;
}
示例#6
0
文件: file.c 项目: TomHartogs/School
/* post   : Returns student information of student with student number Number
 * returns: -1 if Number is not available or in case of an error, 0 if Number is available
 */
extern int linearSearchStudentsFile (char* FileName, int Number, STUDENT* StudentPtr)
{
    if(access(FileName, R_OK ) != -1 && Number)
    {
        FILE *ptr_file = fopen(*FileName, "rb");
        if(ptr_file)
        {
            fseek(ptr_file, 0, SEEK_END);
            int numberOfStudentsInFile = ftell(ptr_file) / sizeof(STUDENT);
            fseek(ptr_file, 0, SEEK_SET);
            int i = 0;
            for (; i < numberOfStudentsInFile; i++)
            {
                STUDENT student;
                readElement(ptr_file, i, &student);
                if(Number == student.StudentNumber)
                {
                    *StudentPtr = student;
                    return 0;
                }
            }
        }
    }
    return -1;
}
示例#7
0
文件: file.c 项目: TomHartogs/School
/* post   : Adds information from StudentPtr to FileName in a sorted way,
 *          if FileName does not exist, a new file is created.
 * returns: -1 in case of an error
 *          0  if a student with the given student number already exists
 *          1  if the student is added to the file
 */
extern int addStudentSortedToFile (char* FileName, STUDENT* StudentPtr)
{
    if(StudentPtr)
    {
        FILE *ptr_file = fopen(*FileName, "r+b");
        if(ptr_file)
        {
            fseek(ptr_file, 0, SEEK_END);
            int numberOfStudentsInFile = ftell(ptr_file) / sizeof(STUDENT);
            fseek(ptr_file, 0, SEEK_SET);
            STUDENT tempStudent;
            tempStudent.StudentNumber  = -1;
            int studentAdded = 0;
            int i = 0;
            for (; i < numberOfStudentsInFile; i++)
            {
                STUDENT foundStudent;
                STUDENT studentPtr = *StudentPtr; //get student number of pointer student?
                readElement(ptr_file, i, &foundStudent);
                if(tempStudent.StudentNumber != -1)
                {
                    writeElement(ptr_file, i, &tempStudent);
                    tempStudent = foundStudent;
                }
                else
                {
                    if(studentPtr.StudentNumber == foundStudent.StudentNumber)
                    {
                        return 0;
                    }
                    else if(studentPtr.StudentNumber < foundStudent.StudentNumber)
                    {
                        readElement(ptr_file, i, &tempStudent);
                        writeElement(ptr_file, i, &StudentPtr);
                        numberOfStudentsInFile++;
                        studentAdded = 1;
                    }
                }
            }
            if (studentAdded)
            {
                return 1;
            }
        }
    }
    return -1;
}
static void run() {
	int lineN;

	scanf("%d", &lineN);
	for (int line = 0; line < lineN; ++line) {
		int command;
		int parentId, childId, elementId;
		int height, width;
		int hash, resultHash;

		Element element;

		scanf("%d", &command);
		switch (command) {
		case INIT:
			scanf("%d", &expected);
			init();
			break;
		case CREATE:
			scanf("%d %d", &elementId, &(element.type));
			readElement(&element);
			id[elementId] = create(&element);
			break;
		case ADD:
			scanf("%d %d", &parentId, &childId);
			add(id[parentId], id[childId]);
			break;
		case SHOW:
			scanf("%d %d %d %d", &elementId, &height, &width, &hash);
			show(id[elementId], screen);
			resultHash = calcHash(screen, height, width);

#if 0
			printf ("Expected W %d H %d\n", width, height);
			for (int y = 0; y < height; ++y)
			{
				for (int x = 0; x < width; ++x)
					printf("%c", screen[y][x]);
				printf("\n");
			}
#endif

			if (resultHash == hash)
			{
				point++;
	//			printf ("%d \n", point);
			}
			else
			{
				printf("FAILED %d %d\n", hash, resultHash);
				exit (0);
				return;
			}
			break;
		}
	}
}
示例#9
0
文件: file.c 项目: grasmanek94/prc22
int binarySearchStudentsFile(char* FileName, int Number, STUDENT* StudentPtr)
/* pre    :
* post   : Returns student information of student with student number Number
* returns: -1 if Number is not available or in case of an error, 0 if Number is available
*/
{
	FILE* fptr = fopen(FileName, "rb");
	if (fptr == NULL || FileName == NULL || StudentPtr == NULL)
	{
		return -1;
	}

	STUDENT student;

	int first, last, middle, n, search;

	n = customfsize(fptr) / sizeof(STUDENT);
	first = 0;
	last = n - 1;
	middle = (first + last) / 2;
	search = Number;

	while (first <= last) 
	{
		if (readElement(fptr, middle, &student))
		{
			if (student.StudentNumber < search)
			{
				first = middle + 1;
			}
			else if (student.StudentNumber == search) 
			{
				//printf("%d found at location %d.\n", search, middle + 1);	
				memcpy(StudentPtr, &student, sizeof(student));
				break;
			}
			else
			{
				last = middle - 1;
			}
			middle = (first + last) / 2;
		}
		else
		{
			break;
		}
	}

	fclose(fptr);
	if (first > last)
	{
		//printf("Not found! %d is not present in the list.\n", search);
		return -1;
	}
	return 0;
}
示例#10
0
/**
 * @fn ident JSONSerialization::objectFromData(const Data *data, int options)
 * @memberof JSONSerialization
 */
static ident objectFromData(const Data *data, int options) {

	if (data && data->length) {
		JSONReader reader = {
			.data = data,
			.options = options
		};

		return readElement(&reader);
	}
示例#11
0
bool ResourceContext_HRS::loadResV2(uint32 contextSize) {
	ResourceData origin;
	uint32 firstEntryOffset;
	uint32 tableSize;
	int i, count;
	const uint32 resourceSize = 4 + 4 + 4;	// id, size, offset

	debug(3, "Context %s =====", _fileName);
	_file.seek(0, SEEK_SET);

	readElement(_file, origin);

	// Check if the file is valid
	if (origin.id != MKID_BE('HRES')) {	// header
		return false;
	}

	// Read offset of first entry
	_file.seek(origin.offset - sizeof(uint32), SEEK_SET);
	firstEntryOffset = _file.readUint32LE();

	// Allocate buffers for table, categories and data
	_categories.resize(origin.size / resourceSize);
	tableSize = origin.offset - firstEntryOffset - sizeof(uint32);
	_table.resize(tableSize / resourceSize);

	// Read categories
	count = origin.size / resourceSize;
	debug(3, "Categories: %d =====", count);
	for (i = 0; i < count; i++) {
		readElement(_file, _categories[i]);
	}

	_file.seek(firstEntryOffset, SEEK_SET);

	// Read table entries
	count = tableSize / resourceSize;
	debug(3, "Entries: %d =====", count);
	for (i = 0; i < count; i++) {
		readElement(_file, _table[i]);
	}
	return true;
}
示例#12
0
const double& SubMatrixReadAccess::readElement(const unsigned int index)
{
	if (index >= (getRows()*getColumns())) {
		error("Matrix::element : Subscript out of range\n");
		return getDataPointer()[0];
	}

	return readElement(index / getColumns(), index % getColumns());

}
示例#13
0
文件: file.c 项目: TomHartogs/School
/* post   : Removes student with StudentNumber from file
 * returns: 0 if StudentNumber was removed from file
 *          -1 if StudentNumber was not found or an error occurs
 */
extern int removeStudentFromFile (char* FileName, int StudentNumber)
{
    if(access(FileName, W_OK ) != -1 && StudentNumber)
    {
        FILE *ptr_file = fopen(*FileName, "r+b");
        if(ptr_file)
        {
            fseek(ptr_file, 0, SEEK_END);
            int numberOfStudentsInFile = ftell(ptr_file) / sizeof(STUDENT);
            fseek(ptr_file, 0, SEEK_SET);
            STUDENT tempStudent;
            tempStudent.StudentNumber  = -1;
            int studentRemoved = 0;
            int i = 0;
            for (; i < numberOfStudentsInFile; i++)
            {
                STUDENT foundStudent;
                readElement(ptr_file, i, &foundStudent);
                if(tempStudent.StudentNumber != -1)
                {
                    readElement(ptr_file, i + 1, &tempStudent);
                    writeElement(ptr_file, i, &tempStudent);
                }
                else
                {
                    if(StudentNumber == foundStudent.StudentNumber)
                    {
                        readElement(ptr_file, i + 1, &tempStudent);
                        writeElement(ptr_file, i, &tempStudent);
                        numberOfStudentsInFile--;
                        studentRemoved = 1;
                    }
                }
            }
            if (studentRemoved)
            {
                return 0;
            }
        }
    }
    return -1;
}
示例#14
0
hashmap* parseTextFormat(std::string text) {
    hashmap* mapValue = new hashmap();
    stringstream in(text);
    while (in.good()) {
        string element;
        readElement(element, in);
        if (element.length() > 0) {
            string name = element.substr(0, element.find_first_of(":"));
            string value = element.substr(element.find_first_of(":") + 1, element.length() - element.find_first_of(":"));
            QString qValue = QString(value.c_str());
            qValue = qValue.trimmed();
            value = qValue.toStdString();
            mapValue->insert(pair<string, string > (name, value));
        }
    }
    return mapValue;
}
示例#15
0
文件: file.c 项目: grasmanek94/prc22
int findElementLinear(FILE* fptr, int Number, STUDENT* StudentPtr)
{
	int index = 0;
	STUDENT student;
	while (readElement(fptr, index++, &student))
	{
		if (student.StudentNumber == Number)
		{
			if (StudentPtr != NULL)
			{
				memcpy(StudentPtr, &student, sizeof(STUDENT));
			}
			return 0;
		}
	}
	return -1;
}
示例#16
0
文件: file.c 项目: TomHartogs/School
/* post   : Returns student information of student with student number Number
 * returns: -1 if Number is not available or in case of an error, 0 if Number is available
 */
extern int binarySearchStudentsFile (char* FileName, int Number, STUDENT* StudentPtr)
{
    if(access(FileName, R_OK ) != -1 && Number)
    {
        FILE *ptr_file = fopen(*FileName, "rb");
        if(ptr_file)
        {
            fseek(ptr_file, 0, SEEK_END);
            int minIndex = 0;
            int maxIndex = (ftell(ptr_file) / sizeof(STUDENT)) - 1;
            fseek(ptr_file, 0, SEEK_SET);
            int IndexesSearched = 0;
            int maxSearchesNeeder = log2(maxIndex) + 1;
            STUDENT student;
            student.StudentNumber = -1;
            int currentNumber = maxIndex/2;
            while(true)
            {
                readElement(ptr_file, currentNumber, &student);
                IndexesSearched++;
                if(IndexesSearched > maxIndex)
                {
                    return -1;
                }
                else if(student.StudentNumber == Number)
                {
                    *StudentPtr = student;
                    return 0;
                }
                else if(student.StudentNumber > Number)
                {
                    maxIndex = currentNumber;
                    currentNumber = minIndex + (maxIndex - minIndex / 2);
                }
                else if(student.StudentNumber < Number)
                {
                    minIndex = currentNumber;
                    currentNumber = minIndex + (maxIndex - minIndex / 2);
                }
            }
        }
    }
    return -1;
}
示例#17
0
/**
 * @brief Reads an array from `reader.
 * @param reader The JSONReader.
 * @return The array.
 */
static Array *readArray(JSONReader *reader) {

	MutableArray *array = $(alloc(MutableArray), init);

	while (true) {

		Object *obj = readElement(reader);
		if (obj == NULL) {
			const int b = readByteUntil(reader, "]");
			assert(b == ']');
			break;
		}

		$(array, addObject, obj);

		release(obj);
	}

	return (Array *) array;
}
示例#18
0
文件: file.c 项目: TomHartogs/School
/* post   : Calculates the average of all study results in a file
 * returns: -1 if an error occurs, 0 if a valid average is computed
 */
extern int computeAverageStudyResults (char* FileName, double* Average)
{
    if(access(FileName, R_OK ) != -1 && Average)
    {
        FILE *ptr_file = fopen(*FileName, "rb");
        if(ptr_file)
        {
            fseek(ptr_file, 0, SEEK_END);
            int numberOfStudentsInFile = ftell(ptr_file) / sizeof(STUDENT);
            *Average = 0;							//* nodig anders veranderd de pointer toch?
            int i = 0;
            for (; i < numberOfStudentsInFile; i++)
            {
                STUDENT student;
                readElement(ptr_file, i, &student);
                *Average += student.StudyCredits; 	//* nodig anders veranderd de pointer toch?
            }
            *Average /= numberOfStudentsInFile;		//* nodig anders kan je waar de pointer naar verwijst niet veranderen toch?
            return 0;
        }
    }
    return -1;
}
示例#19
0
文件: linklist.c 项目: yoyoerx/libds
int IterateRead(const LLIterator iterator, void* data){
	if(iterator->marker==NULL) return LLUNDERRUN;
	return readElement(iterator->marker, data, iterator->list->elementSize);
}
示例#20
0
文件: linklist.c 项目: yoyoerx/libds
int readFirstElement(const LinkedList list, void* data){
	ListElement* toRead = list->begining;
	if(readElement(toRead, data, list->elementSize)==LLFAIL) return LLUNDERRUN;
	return LLSUCCESS;
}
示例#21
0
文件: linklist.c 项目: yoyoerx/libds
int readLastElement(const LinkedList list, void* data){
	ListElement* toRead = list->end;
	if(readElement(toRead, data, list->elementSize)==LLFAIL) return LLOVERRUN;
	return LLSUCCESS;
}
示例#22
0
文件: linklist.c 项目: yoyoerx/libds
//readElementI() provides a copy of the data in ListElement i
//list : a pointer to the LinkedList to read the data from
//data : a pointer to memory allocated to accept the data from the list
//			assumes that data is correctly sized based on list->elementSize
//i : the data will be read from the ith element of the list
//returns : a  status code as defined in linklist.h
//			if i>number of elements, data is not changed and returns LLUNDERRUN
int readElementI(const LinkedList list, void* data, int i){
	ListElement* toRead = iterate(list,i);
	if(readElement(toRead, data, list->elementSize)==LLFAIL) return LLOVERRUN;
	return LLSUCCESS;
}
	bool TestSerializationBuffer::testReadWrite()
	{
		bool pass = true;

		std::queue< std::vector< char > > values;
		hydrazine::SerializationBuffer buffer;
		
		for( unsigned int i = 0; i < iterations; i++ )
		{
			unsigned int size = random() % maxSize;
			
			std::vector< char > element( size );
			
			for( std::vector< char >::iterator fi = element.begin(); 
				fi != element.end(); fi++ )
			{
				*fi = random();
			}
			
			buffer.write( &element[0], size );
			values.push( element );
			
			while( ( ( random() & 0x1 ) > 0 ) && !values.empty() )
			{
				std::vector< char > readElement( values.front().size() );
				
				buffer.read( &readElement[0], readElement.size() );
			
				std::vector< char >::iterator vi = values.front().begin();
			
				for( std::vector< char >::iterator fi = readElement.begin(); 
					fi != readElement.end(); fi++ )
				{
					assert( vi != values.front().end() );
				
					unsigned int val = *fi;
					unsigned int ref = *vi;
				
					if( val != ref )
					{
						status << "Read write test failed at iteration " << i 
							<< ", read value " << val 
							<< " did not match reference " << ref << ".\n";
						pass = false;
					}
				
					++vi;
				}
				
				if( !pass )
				{
					break;
				}
				
				values.pop();
			}
			
			if( !pass )
			{
				break;
			}
		}
		
		while( !values.empty() )
		{		
			std::vector< char > readElement( values.front().size() );

			buffer.read( &readElement[0], readElement.size() );
		
			std::vector< char >::iterator vi = values.front().begin();
		
			for( std::vector< char >::iterator fi = readElement.begin(); 
				fi != readElement.end(); fi++ )
			{
				assert( vi != values.front().end() );
			
				unsigned int val = *fi;
				unsigned int ref = *vi;
			
				if( val != ref )
				{
					status << "Read write test failed at end, read value " 
						<< val << " did not match reference " << ref << ".\n";
					pass = false;
				}
			
				++vi;
			}
			
			if( !pass )
			{
				break;
			}
			
			values.pop();
		}

		return pass;
	}
示例#24
0
bool Account::readElements(QXmlStreamReader *xml, bool *valid) {
	while(xml->readNextStartElement()) {
		if(!readElement(xml, valid)) xml->skipCurrentElement();
	}
	return true;
}
示例#25
0
bool PrologLoader :: LOAD (char * file_name) {
	bool ret;
	AREA command;
	ri = NULL;
	fi = NULL;
	drop_instructions ();
	if (root -> resource_loader != NULL) ri = root -> resource_loader -> load (file_name);
	if (ri == NULL) {
		fi = fopen (file_name, "rb");
		PrologString * root_directory = root -> search_directories;
		while (root_directory != NULL && fi == NULL) {
			sprintf (command, "%s%s", root_directory -> text, file_name);
			fi = fopen (command, "rb");
			root_directory = root_directory -> next;
		}
		if (fi == NULL) {
			ri = load_plugin_module (file_name);
			if (ri == 0) {message_v ("File not found: ", file_name); return false;}
		}
	}
	get_symbol ();
	PrologDirectory * import;
	clear_context ();
//	if (root != NULL) search_context = root -> root;
	PrologDirectory * user_directory = NULL;
	if (root != NULL) user_directory = root -> root;
	while (symbol_control == 11 && strcmp (root -> import_caption, symbol) == 0) {
		get_symbol ();
		switch (symbol_control) {
		case 8: if (root -> searchDirectoryNotFound (symbol)) root -> addSearchDirectory (symbol); break;
		case 11:
			import = root -> searchDirectory (symbol);
			if (import == NULL) {
				PrologLoader * loader = new PrologLoader (root);
				area_cat (command, 0, symbol);
				area_cat (command, ".prc");
				ret = loader -> load (command);
				delete loader;
				if (! ret) {message_v ("Module not loaded: ", command); close (); return false;}
				import = root -> searchDirectory (symbol);
			}
			if (import != NULL) search_context = import -> duplicate (search_context);
			break;
		default: message ("Syntax error: import module or search path expected."); close (); return false;
		}
		get_symbol ();
	}
	while (symbol_control == 31) {
		if (strcmp (symbol, "uap32") == 0) root -> set_uap32_captions ();
		if (strcmp (symbol, "standard") == 0) root -> set_standard_captions ();
		if (strcmp (symbol, "edinburg") == 0) root -> set_edinburg_captions ();
		if (strcmp (symbol, "marseille") == 0) root -> set_marseille_captions ();
		if (strcmp (symbol, "functional") == 0) root -> set_functional_captions ();
		get_symbol ();
	}
	if (symbol_control != 11 || strcmp (root -> program_caption, symbol) != 0) {message ("Syntax error: program header expected."); close (); return false;}
	get_symbol ();
	if (symbol_control != 11) {message ("Syntax error: program name expected."); close (); return false;}
	PROLOG_STRING program_name;
	prolog_string_copy (program_name, symbol);
	PrologServiceClass * service_class = NULL;
	if (reload) root -> drop (program_name);
	else if (root -> searchDirectory (program_name) != NULL) {close (); return true;}
	get_symbol ();
	PrologDirectory * directory;
	if (symbol_control == 11 && strcmp (root -> machine_caption, symbol) == 0) {
		get_symbol ();
		if (symbol_control != 11 || strcmp (root -> if_atom_caption, symbol) != 0) {
			message ("Syntax error: machine assignment expected in program header.");
			close ();
			return false;
		}
		get_symbol ();
		if (symbol_control != 8) {message ("Syntax error: service class name expected."); close (); return false;}
		service_class = root -> loadServiceClass (symbol);
		if (service_class == NULL) {message_v ("Service class crashed or not found: ", symbol); close (); return false;}
		get_symbol ();
		directory = root -> createDirectory (program_name, service_class);
	} else directory = root -> createDirectory (program_name);
	root -> auto_atoms = false;
	switch (symbol_control) {
	case 11:
		if (strcmp (root -> auto_atoms_caption, symbol) != 0) {
			message ("Syntax error: auto expected.");
			root -> drop ();
			close ();
			return false;
		}
		root -> auto_atoms = true;
		get_symbol ();
		break;
	case 6: get_symbol (); break;
	case 1:
		get_symbol ();
		while (symbol_control != 2) {
			switch (symbol_control) {
			case 11: root -> createAtom (symbol); break;
			case 21: root -> createAtom (symbol); break;
			default:
				message ("Syntax error: atom expected.");
				root -> drop ();
				close ();
				return false;
				break;
			}
			get_symbol ();
			if (strlen (root -> separator_caption) > 0) {
				if (symbol_control != 23 && symbol_control != 2) {
					message ("Syntax error: separator missing.");
					root -> drop ();
					close ();
					return false;
				}
				if (symbol_control == 23) get_symbol ();
			}
		}
		get_symbol ();
		break;
	default: message ("Syntax error: atome list expected."); root -> drop (); close (); return false;
	}
	//
	if (service_class != 0) service_class -> init (root, directory);
	if (directory != NULL) search_context = directory -> duplicate (search_context);
	PrologDirectory * dt = search_context;
	if (dt != NULL) {
		while (dt -> next != NULL) dt = dt -> next;
		dt -> next = user_directory;
	}
//	message (file_name);
//	dt = search_context;
//	while (dt != NULL) {message (dt -> directoryName); dt = dt -> next;}
//	message ("===");
//	dt = root -> root;
//	while (dt != NULL) {message (dt -> directoryName); dt = dt -> next;}
//	message ("");
	//
	PrologElement * clause = NULL;
	PrologAtom * atom = NULL;
	PrologNativeCode * native_code = NULL;
	PrologResolution * resolution = NULL;
	PrologAtom * preprocessor = NULL;
	PrologDirectory * preprocessor_directory;
	while (true) {
		switch (symbol_control) {
		case 11:
			if (strcmp (root -> machine_caption, symbol) == 0) {
				get_symbol ();
				if (symbol_control != 11) {
					message ("Syntax error: atom expected.");
					root -> drop ();
					close ();
					return false;
				}
				atom = searchAtomC (symbol); //root -> search (symbol);
				if (atom == NULL) {
					message_v ("Unknown atom: ", symbol);
					root -> drop ();
					close ();
					return false;
				}
				if (atom -> getMachine () != 0) {
					message_v ("Atom has already machine code attached: ", symbol);
					root -> drop ();
					close ();
					return false;
				}
				get_symbol ();
				if (symbol_control != 11 || strcmp (root -> if_atom_caption, symbol) != 0) {
					message ("Syntax error: machine assignment expected.");
					root -> drop ();
					close ();
					return false;
				}
				get_symbol ();
				if (symbol_control != 8) {
					message ("Syntax error: machine name expected.");
					root -> drop ();
					close ();
					return false;
				}
				if (service_class == NULL) {
					message ("Service class missing.");
					root -> drop ();
					close ();
					return false;
				}
				native_code = service_class -> getNativeCode (symbol);
				if (native_code == NULL) {
					message_v ("Unknown native class: ", symbol);
					root -> drop ();
					close ();
					return false;
				}
				atom -> setMachine (native_code);
				get_symbol ();
				break;
			}
//		case 11:
			if (strcmp (root -> end_caption, symbol) == 0) {
				get_symbol ();
				clause = NULL;
				if (symbol_control == 11 && strcmp (root -> if_atom_caption, symbol) == 0) {
					clause = readElement ();
					if (clause == NULL) {
						// suspiciouse drop 1
						root -> drop ();
						close ();
						return false;
					}
					get_symbol ();
				}
				if (symbol_control == 21) {
					if (echo) message ("");
					root -> close ();
					if (clause != 0) instructions = clause;
					close ();
					return true;
				}
				message ("Syntax error: dot expected.");
				root -> drop ();
				close ();
				return false;
			}
			if (strcmp (root -> protect_caption, symbol) == 0) {
				get_symbol ();
				if (symbol_control == 6) {get_symbol (); break;}
				if (symbol_control != 1) {
					message ("Syntax error: atome list expected.");
					root -> drop ();
					close ();
					return false;
				}
				get_symbol ();
				while (symbol_control != 2) {
					if (symbol_control != 11) {
						message ("Syntax error: atom expected.");
						root -> drop ();
						close ();
						return false;
					}
					if (! root -> Protect (symbol)) {
						root -> message ("Can not protect unknown atom:", symbol);
						root -> drop ();
						close ();
						return false;
					}
					get_symbol ();
					if (strlen (root -> separator_caption) > 0) {
						if (symbol_control != 23 && symbol_control != 2) {
							message ("Syntax error: separator missing.");
							root -> drop ();
							close ();
							return false;
						}
						if (symbol_control == 23) get_symbol ();
					}
				}
				get_symbol ();
				break;
			}
			if (strcmp (root -> private_caption, symbol) == 0) {
				get_symbol ();
				if (symbol_control == 6) {get_symbol (); break;}
				if (symbol_control != 1) {
					message ("Syntax error: atome list expected.");
					root -> drop ();
					close ();
					return false;
				}
				get_symbol ();
				while (symbol_control != 2) {
					if (symbol_control != 11) {
						message ("Syntax error: atom expected.");
						root -> drop ();
						close ();
						return false;
					}
					if (! root -> Private (symbol)) {
						root -> message ("Can not lock unknown atom as private:", symbol);
						root -> drop ();
						close ();
						return false;
					}
					get_symbol ();
					if (strlen (root -> separator_caption) > 0) {
						if (symbol_control != 23 && symbol_control != 2) {
							message ("Syntax error: separator missing.");
							root -> drop ();
							close ();
							return false;
						}
						if (symbol_control == 23) get_symbol ();
					}
				}
				get_symbol ();
				break;
			}
			if (strcmp (root -> preprocessor_caption, symbol) == 0) {
				get_symbol ();
				if (symbol_control != 11 && strcmp (root -> if_atom_caption, symbol) != 0) {
					message ("Syntax error: preprocessor assignment expected.");
					root -> drop ();
					close ();
					return false;
				}
				get_symbol ();
				if (symbol_control == 6) {
//					directory -> setPreprocessor (NULL);
					preprocessor = NULL;
					get_symbol ();
					break;
				}
				if (symbol_control != 11) {
					if (symbol_control == 22) {
						get_symbol ();
						if (symbol_control != 11) {
							message ("Syntax error: directory name expected in qualified preprocessor name.");
							root -> drop ();
							close ();
							return false;
						}
						preprocessor_directory = root -> searchDirectory (symbol);
						if (preprocessor_directory == NULL) {
							message_v ("Directory not found in qualified preprocessor name:", symbol);
							root -> drop ();
							close ();
							return false;
						}
						get_symbol ();
						if (symbol_control != 21) {
							message ("Syntax error: dot expected in qualified preprocessor name.");
							root -> drop ();
							close ();
							return false;
						}
						get_symbol ();
						if (symbol_control != 11) {
							message ("Syntax error: qualified preprocessor name expected.");
							root -> drop ();
							close ();
							return false;
						}
						atom = preprocessor_directory -> searchAtom (symbol);
					} else {
						message ("Syntax error: atom expected.");
						root -> drop ();
						close ();
						return false;
					}
				} else {
					atom = searchAtom (symbol); //root -> search (symbol);
				}
				if (atom == NULL) {
					message_v ("Unknown atom: ", symbol);
					root -> drop ();
					close ();
					return false;
				}
//				directory -> setPreprocessor (atom);
				preprocessor = atom;
				get_symbol ();
				break;
			}
			if (strcmp (root -> auto_caption, symbol) == 0) {
				get_symbol ();
				if (symbol_control != 11 && strcmp (root -> if_atom_caption, symbol) != 0) {
					message ("Syntax error: auto assignment expected.");
					root -> drop ();
					close ();
					return false;
				}
				clause = readElement ();
				// suspicious drop 2
				if (clause == NULL) {root -> drop (); close (); return false;}
				clause = root -> pair (root -> head (NULL), clause);
				//root -> resolution (clause);
				resolution = new PrologResolution (root);
				resolution -> resolution (clause);
				delete resolution;
				delete clause;
				get_symbol ();
				break;
			}
		case 1:
//			atom = root -> getPreprocessor ();
			if (preprocessor != NULL) {
				clause = readElement ();
				if (clause == NULL) {root -> drop (); close (); return false;}
				clause = readRightSide (clause, false);
				if (clause == NULL) {root -> drop (); close (); return false;}
				get_symbol ();
				clause = root -> pair (root -> var (0), root -> pair (root -> pair (root -> atom (preprocessor), root -> pair (clause, root -> earth ())), root -> earth ()));
				resolution = new PrologResolution (root);
				resolution -> resolution (clause);
				delete resolution;
				delete clause;
				break;
			}
			clause = readClause ();
			get_symbol ();
			// suspicious drop 3
			if (clause == NULL) {root -> drop (); close (); return false;}
			if (root -> attachClause (clause) == 0) break;
			// suspicious drop 4
			root -> drop ();
			close ();
			return false;
		default: message ("Syntax error: at least clause expected."); root -> drop (); close (); return false;
		}
	}
}
void LLSDXMLParser::Impl::endElementHandler(const XML_Char* name)
{
	#ifdef XML_PARSER_PERFORMANCE_TESTS
	XML_Timer timer(&endElementTime);
	#endif // XML_PARSER_PERFORMANCE_TESTS

	--mDepth;
	if (mSkipping)
	{
		if (mDepth < mSkipThrough)
		{
			mSkipping = false;
		}
		return;
	}

	Element element = readElement(name);

	switch (element)
	{
		case ELEMENT_LLSD:
			if (mInLLSDElement)
			{
				mInLLSDElement = false;
				mGracefullStop = true;
				XML_StopParser(mParser, false);
			}
			return;

		case ELEMENT_KEY:
			mCurrentKey = mCurrentContent;
			return;

		default:
			// all rest are values, fall through
			;
	}

	if (!mInLLSDElement) { return; }

	LLSD& value = *mStack.back();
	mStack.pop_back();

	switch (element)
	{
		case ELEMENT_UNDEF:
			value.clear();
			break;

		case ELEMENT_BOOL:
			value = (mCurrentContent == "true" || mCurrentContent == "1");
			break;

		case ELEMENT_INTEGER:
		{
			S32 i;
			if (sscanf(mCurrentContent.c_str(), "%d", &i) == 1)
			{	// See if sscanf works - it's faster
				value = i;
			}
			else
			{
				value = LLSD(mCurrentContent).asInteger();
			}
			break;
		}

		case ELEMENT_REAL:
		{
			// sscanf() is sensitive to the locale and will fail decoding
			// the decimal point for locales where the decimal separator
			// is a comma... So, better not using sscanf() for this purpose.
			// See http://jira.secondlife.com/browse/EXP-700
#if 0
			F64 r;
			if (sscanf(mCurrentContent.c_str(), "%lf", &r) == 1)
			{	// See if sscanf works - it's faster
				value = r;
			}
			else
			{
				value = LLSD(mCurrentContent).asReal();
			}
#else
			value = LLSD(mCurrentContent).asReal();
#endif
			break;
		}

		case ELEMENT_STRING:
			value = mCurrentContent;
			break;

		case ELEMENT_UUID:
			value = LLSD(mCurrentContent).asUUID();
			break;

		case ELEMENT_DATE:
			value = LLSD(mCurrentContent).asDate();
			break;

		case ELEMENT_URI:
			value = LLSD(mCurrentContent).asURI();
			break;

		case ELEMENT_BINARY:
		{
			// Regex is expensive, but only fix for whitespace in base64,
			// created by python and other non-linden systems - DEV-39358
			// Fortunately we have very little binary passing now,
			// so performance impact shold be negligible. + poppy 2009-09-04
			boost::regex r;
			r.assign("\\s");
			std::string stripped = boost::regex_replace(mCurrentContent, r, "");
			S32 len = apr_base64_decode_len(stripped.c_str());
			std::vector<U8> data;
			data.resize(len);
			len = apr_base64_decode_binary(&data[0], stripped.c_str());
			data.resize(len);
			value = data;
			break;
		}

		case ELEMENT_UNKNOWN:
			value.clear();
			break;

		default:
			// other values, map and array, have already been set
			break;
	}

	mCurrentContent.clear();
}
示例#27
0
void LLSDXMLParser::Impl::endElementHandler(const XML_Char* name)
{
	#ifdef XML_PARSER_PERFORMANCE_TESTS
	XML_Timer timer( &endElementTime );
	#endif // XML_PARSER_PERFORMANCE_TESTS

	--mDepth;
	if (mSkipping)
	{
		if (mDepth < mSkipThrough)
		{
			mSkipping = false;
		}
		return;
	}
	
	Element element = readElement(name);
	
	switch (element)
	{
		case ELEMENT_LLSD:
			if (mInLLSDElement)
			{
				mInLLSDElement = false;
				mGracefullStop = true;
				XML_StopParser(mParser, false);
			}
			return;
	
		case ELEMENT_KEY:
			mCurrentKey = mCurrentContent;
			return;
			
		default:
			// all rest are values, fall through
			;
	}
	
	if (!mInLLSDElement) { return; }

	LLSD& value = *mStack.back();
	mStack.pop_back();
	
	switch (element)
	{
		case ELEMENT_UNDEF:
			value.clear();
			break;
		
		case ELEMENT_BOOL:
			value = (mCurrentContent == "true" || mCurrentContent == "1");
			break;
		
		case ELEMENT_INTEGER:
			{
				S32 i;
				if ( sscanf(mCurrentContent.c_str(), "%d", &i ) == 1 )
				{	// See if sscanf works - it's faster
					value = i;
				}
				else
				{
					value = LLSD(mCurrentContent).asInteger();
				}
			}
			break;
		
		case ELEMENT_REAL:
			{
				F64 r;
				if ( sscanf(mCurrentContent.c_str(), "%lf", &r ) == 1 )
				{	// See if sscanf works - it's faster
					value = r;
				}
				else
				{
					value = LLSD(mCurrentContent).asReal();
				}
			}
			break;
		
		case ELEMENT_STRING:
			value = mCurrentContent;
			break;
		
		case ELEMENT_UUID:
			value = LLSD(mCurrentContent).asUUID();
			break;
		
		case ELEMENT_DATE:
			value = LLSD(mCurrentContent).asDate();
			break;
		
		case ELEMENT_URI:
			value = LLSD(mCurrentContent).asURI();
			break;
		
		case ELEMENT_BINARY:
		{
			S32 len = apr_base64_decode_len(mCurrentContent.c_str());
			std::vector<U8> data;
			data.resize(len);
			len = apr_base64_decode_binary(&data[0], mCurrentContent.c_str());
			data.resize(len);
			value = data;
			break;
		}
		
		case ELEMENT_UNKNOWN:
			value.clear();
			break;
			
		default:
			// other values, map and array, have already been set
			break;
	}

	mCurrentContent.clear();
}
void LLSDXMLParser::Impl::startElementHandler(const XML_Char* name, const XML_Char** attributes)
{
	#ifdef XML_PARSER_PERFORMANCE_TESTS
	XML_Timer timer( &startElementTime );
	#endif // XML_PARSER_PERFORMANCE_TESTS
	
	++mDepth;
	if (mSkipping)
	{
		return;
	}

	Element element = readElement(name);
	
	mCurrentContent.clear();

	switch (element)
	{
		case ELEMENT_LLSD:
			if (mInLLSDElement) { return startSkipping(); }
			mInLLSDElement = true;
			return;
	
		case ELEMENT_KEY:
			if (mStack.empty()  ||  !(mStack.back()->isMap()))
			{
				return startSkipping();
			}
			return;

		case ELEMENT_BINARY:
		{
			const XML_Char* encoding = findAttribute("encoding", attributes);
			if(encoding && strcmp("base64", encoding) != 0) { return startSkipping(); }
			break;
		}
		
		default:
			// all rest are values, fall through
			;
	}
	

	if (!mInLLSDElement) { return startSkipping(); }
	
	if (mStack.empty())
	{
		mStack.push_back(&mResult);
	}
	else if (mStack.back()->isMap())
	{
		if (mCurrentKey.empty()) { return startSkipping(); }
		
		LLSD& map = *mStack.back();
		LLSD& newElement = map[mCurrentKey];
		mStack.push_back(&newElement);		

		mCurrentKey.clear();
	}
	else if (mStack.back()->isArray())
	{
		LLSD& array = *mStack.back();
		array.append(LLSD());
		LLSD& newElement = array[array.size()-1];
		mStack.push_back(&newElement);
	}
	else {
		// improperly nested value in a non-structure
		return startSkipping();
	}

	++mParseCount;
	switch (element)
	{
		case ELEMENT_MAP:
			*mStack.back() = LLSD::emptyMap();
			break;
		
		case ELEMENT_ARRAY:
			*mStack.back() = LLSD::emptyArray();
			break;
			
		default:
			// all the other values will be set in the end element handler
			;
	}
}
void LLSDXMLParser::Impl::endElementHandler(const XML_Char* name)
{
	#ifdef XML_PARSER_PERFORMANCE_TESTS
	XML_Timer timer( &endElementTime );
	#endif // XML_PARSER_PERFORMANCE_TESTS

	--mDepth;
	if (mSkipping)
	{
		if (mDepth < mSkipThrough)
		{
			mSkipping = false;
		}
		return;
	}
	
	Element element = readElement(name);
	
	switch (element)
	{
		case ELEMENT_LLSD:
			if (mInLLSDElement)
			{
				mInLLSDElement = false;
				mGracefullStop = true;
				XML_StopParser(mParser, false);
			}
			return;
	
		case ELEMENT_KEY:
			mCurrentKey = mCurrentContent;
			return;
			
		default:
			// all rest are values, fall through
			;
	}
	
	if (!mInLLSDElement) { return; }

	LLSD& value = *mStack.back();
	mStack.pop_back();
	
	switch (element)
	{
		case ELEMENT_UNDEF:
			value.clear();
			break;
		
		case ELEMENT_BOOL:
			value = (mCurrentContent == "true" || mCurrentContent == "1");
			break;
		
		case ELEMENT_INTEGER:
			{
				S32 i;
				// sscanf okay here with different locales - ints don't change for different locale settings like floats do.
				if ( sscanf(mCurrentContent.c_str(), "%d", &i ) == 1 )
				{	// See if sscanf works - it's faster
					value = i;
				}
				else
				{
					value = LLSD(mCurrentContent).asInteger();
				}
			}
			break;
		
		case ELEMENT_REAL:
			{
				value = LLSD(mCurrentContent).asReal();
				// removed since this breaks when locale has decimal separator that isn't '.'
				// investigated changing local to something compatible each time but deemed higher
				// risk that just using LLSD.asReal() each time.
				//F64 r;
				//if ( sscanf(mCurrentContent.c_str(), "%lf", &r ) == 1 )
				//{	// See if sscanf works - it's faster
				//	value = r;
				//}
				//else
				//{
				//	value = LLSD(mCurrentContent).asReal();
				//}
			}
			break;
		
		case ELEMENT_STRING:
			value = mCurrentContent;
			break;
		
		case ELEMENT_UUID:
			value = LLSD(mCurrentContent).asUUID();
			break;
		
		case ELEMENT_DATE:
			value = LLSD(mCurrentContent).asDate();
			break;
		
		case ELEMENT_URI:
			value = LLSD(mCurrentContent).asURI();
			break;
		
		case ELEMENT_BINARY:
		{
			// Regex is expensive, but only fix for whitespace in base64,
			// created by python and other non-linden systems - DEV-39358
			// Fortunately we have very little binary passing now,
			// so performance impact shold be negligible. + poppy 2009-09-04
			boost::regex r;
			r.assign("\\s");
			std::string stripped = boost::regex_replace(mCurrentContent, r, "");
			size_t len = LLBase64::requiredDecryptionSpace(stripped);
			std::vector<U8> data;
			data.resize(len);
			len = LLBase64::decode(stripped, &data[0], len);
			data.resize(len);
			value = data;
			break;
		}
		
		case ELEMENT_UNKNOWN:
			value.clear();
			break;
			
		default:
			// other values, map and array, have already been set
			break;
	}

	mCurrentContent.clear();
}
示例#30
0
文件: file.c 项目: grasmanek94/prc22
int removeStudentFromFile(char* FileName, int StudentNumber)
/* pre    :
* post   : Removes student with StudentNumber from file
* returns: 0 if StudentNumber was removed from file
*          -1 if StudentNumber was not found or an error occurs
*/
{
	FILE* tmp = tmpfile();
	if (tmp == NULL || FileName == NULL)
	{
		return -1;
	}

	FILE* fptr = fopen(FileName, "rb");
	if (fptr == NULL)
	{
		fclose(tmp);
		return -1;
	}

	int index = 0;
	int written = 0;
	STUDENT student;
	bool found = false;

	while (readElement(fptr, index++, &student))
	{
		if (student.StudentNumber != StudentNumber)
		{
			if (writeElement(tmp, written++, &student) != 0)
			{
				fclose(fptr);
				fclose(tmp);
				found = false;
				return -1;
			}
		}
		else
		{
			found = true;
		}
	}

	if (found)
	{
		fclose(fptr);
		remove(FileName);
		fptr = fopen(FileName, "wb");
		if (fptr == NULL)
		{
			fclose(tmp);
			return -1;
		}
		fseek(tmp, 0, SEEK_SET);

		//copy contents of tmp to FileName
		int a;
		bool comp;
		do {
			a = fgetc(tmp);
			comp = a != EOF;
			if (comp)
			{
				fputc(a, fptr);
			}
		} while (comp);

		fclose(fptr);
		fclose(tmp);

		return 0;
	}

	return -1;
}