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; }
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; }
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; }
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; }
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; }