Example #1
0
	bool readsubrecord() {
		auto index = 0;
		auto last_field = 0;
		while(skip("##")) {
			// Read data base name
			if(!readidentifier()) {
				error(ErrorExpectedIdentifier);
				return true;
			}
			skipws();
			auto parent_field = parent_type->find(buffer);
			if(!parent_field) {
				error(ErrorNotFoundMember1pInBase2p, buffer, "");
				return true;
			}
			if(parent_field->count <= 1 // Only array may be defined as ##
				|| parent_field->reference // No reference allowed
				|| parent_field->isenum // Enumeratior must be initialized in row
				|| parent_field->type->issimple()) { // No Simple type
				error(ErrorExpectedArrayField);
			}
			readfields((void*)parent_field->ptr(parent_object, index),
				parent_field->type);
			index++;
		}
		// If aref or adat save count
		return false;
	}
Example #2
0
	bool readrecord() {
		if(!skip('#'))
			return false;
		// Read data base name
		if(!readidentifier()) {
			error(ErrorExpectedIdentifier);
			return true;
		}
		skipws();
		const bsreq* fields = 0;
		auto pd = bsdata::find(buffer);
		if(pd)
			fields = pd->fields;
		else
			warning(ErrorNotFoundBase1p, buffer);
		// Read key value
		parent_object = value_object;
		if(iskey(p))
			readvalue(fields, true);
		else if(pd)
			value_object = pd->add();
		else
			value_object = 0;
		readfields(value_object, fields);
		parent_type = fields;
		return true;
	}
Example #3
0
	bool readfields(void* object, const bsreq* fields) {
		while(*p && !islinefeed()) {
			const bsreq* req = 0;
			if(readidentifier())
				req = fields->find(buffer);
			if(!req)
				warning(ErrorNotFoundMember1pInBase2p, buffer, getbasename(fields));
			readreq(object, req, 0);
		}
		return true;
	}
Example #4
0
static const string * lex(FormatState * fs){
	//Ò»´Î¶ÁÈ¡Ò»¸ö×Ö·û´®
	while (fs->curpos+1 < fs->len) {
		unsigned char c = next();
		//ÊÇ·ñÊÇ¿Õ°×
		if (c == '_' || isalpha(c)){ //identifier
			return readidentifier(fs);
		}
		else if (isdigit(c)){	//Êý×Ö
			return readdigit(fs);
		}
		else if (c == '-'){
			if (peek() == '-'){ //×¢ÊÍ
				next();
				return readcomment(fs);
			}
			return readpunct(fs);
		} else if (c == '\"') {
			return readstring(fs);
		} else if (c == '\'') {
			return readstring(fs);
		} else if (c == '[') {
			if (peek() == '[') {
				next();
				return readstring(fs);
			}
			return readpunct(fs);
		}
		else if (ispunct(c)){ //±êµã
			return readpunct(fs);
		}
		else if (c == ' ' || c == '\t'){
			return readblank(fs);
		} else if (c == '\r' || c == '\n') {
			return readnewline(fs);
		}
		else {
			assert(0);
		}
		
	}
	return 0;
}
Example #5
0
	bool readvalue(const bsreq* hint_type, bool create) {
		bool need_identifier = false;
		buffer[0] = 0;
		value = 0;
		value_type = 0;
		value_object = 0;
		if(p[0] == '-' || (p[0] >= '0' && p[0] <= '9')) {
			value = sz2num(p, &p);
			value_type = number_type;
		} else if(p[0] == '\'') {
			p++;
			readstring('\'');
			value_type = text_type;
			need_identifier = true;
		} else if(p[0] == '\"') {
			p++;
			readstring('\"');
			value_type = text_type;
		} else if(readidentifier()) {
			value_type = text_type;
			need_identifier = true;
		} else
			return false; // Not found value tag
		if(need_identifier) {
			auto value_data = bsdata::find(hint_type);
			if(!value_data) {
				for(value_data = bsdata::first; value_data; value_data = value_data->next) {
					auto f = value_data->fields->getkey();
					if(!f)
						continue;
					value_object = value_data->find(f, buffer);
					if(value_object)
						break;
				}
			} else
				value_object = value_data->find(value_data->fields->getkey(), buffer);
			// If not find create this
			if(!value_object && value_data && create) {
				auto f = value_data->fields->getkey();
				if(f) {
					value_object = value_data->add();
					f->set(f->ptr(value_object), (int)szdup(buffer));
				}
			}
			if(value_data)
				value_type = value_data->fields;
			else
				value_type = number_type;
			if(value_object && value_data)
				value = value_data->indexof(value_object);
			if(!value_object)
				warning(ErrorNotFoundIdentifier1p, buffer);
		} else if(create && hint_type && value_type == number_type) {
			auto value_data = bsdata::find(hint_type);
			value_type = hint_type;
			if(value_data) {
				if(value < (int)value_data->getmaxcount()) {
					if(value >= (int)value_data->getcount())
						value_data->setcount(value + 1);
					value_object = value_data->get(value);
				}
			}
		}
		skipws();
		return true;
	}