mork_bool morkParser::ReadMid(morkEnv* ev, morkMid* outMid) { outMid->ClearMid(); morkStream* s = mParser_Stream; int next; outMid->mMid_Oid.mOid_Id = this->ReadHex(ev, &next); register int c = next; if ( c == ':' ) { if ( (c = s->Getc(ev)) != EOF && ev->Good() ) { if ( c == '^' ) { outMid->mMid_Oid.mOid_Scope = this->ReadHex(ev, &next); if ( ev->Good() ) s->Ungetc(next); } else if ( morkCh_IsName(c) ) { outMid->mMid_Buf = this->ReadName(ev, c); } else ev->NewError("expected name or hex after ':' following ID"); } if ( c == EOF && ev->Good() ) this->UnexpectedEofError(ev); } else s->Ungetc(c); return ev->Good(); }
morkBuf* morkParser::ReadName(morkEnv* ev, register int c) { morkBuf* outBuf = 0; if ( !morkCh_IsName(c) ) ev->NewError("not a name char"); morkCoil* coil = &mParser_ColumnCoil; coil->ClearBufFill(); morkSpool* spool = &mParser_ColumnSpool; spool->Seek(ev, /*pos*/ 0); if ( ev->Good() ) { spool->Putc(ev, c); morkStream* s = mParser_Stream; while ( (c = s->Getc(ev)) != EOF && morkCh_IsMore(c) && ev->Good() ) spool->Putc(ev, c); if ( ev->Good() ) { if ( c != EOF ) { s->Ungetc(c); spool->FlushSink(ev); // update coil->mBuf_Fill } else this->UnexpectedEofError(ev); if ( ev->Good() ) outBuf = coil; } } return outBuf; }
mork_size morkEnv::OidAsHex(void* outBuf, const mdbOid& inOid) // sprintf(buf, "%lX:^%lX", (long) inOid.mOid_Id, (long) inOid.mOid_Scope); { mork_u1* p = (mork_u1*) outBuf; mork_size outSize = this->TokenAsHex(p, inOid.mOid_Id); p += outSize; *p++ = ':'; mork_scope scope = inOid.mOid_Scope; if ( scope < 0x80 && morkCh_IsName((mork_ch) scope) ) { *p++ = (mork_u1) scope; *p = 0; // null termination outSize += 2; } else { *p++ = '^'; mork_size scopeSize = this->TokenAsHex(p, scope); outSize += scopeSize + 2; } return outSize; }