void EvalGDefine(const void *data, qCtx *ctx, qStr *out, qArgAry *args) { VALID_ARGM("gdefine", 1); CStr name; qObj *obj = CreateDef(ctx, out, args, name); if (!name.Length()) { if (obj) obj->Free(); return; } if (obj) if (ctx->GetEnv() && ctx->GetEnv()->GetSessionCtx()) { ctx->MapObjTop(obj, name, ctx->GetEnv()->GetSessionCtx()); } else { ctx->MapObjTop(obj, name, NULL); } else if (ctx->GetEnv() && ctx->GetEnv()->GetSessionCtx()) { ctx->DelObjTop(name, ctx->GetEnv()->GetSessionCtx()); } else { ctx->DelObjTop(name, NULL); } }
void File::ParseDefs(InputStream& s, Reference* pParentRef) { while(s.SkipWhiteSpace(L";") != '}' && s.PeekChar() != Stream::EOS) { NodePriority priority = PNormal; CAtlList<CStringW> types; CStringW name; int c = s.SkipWhiteSpace(); if(c == '*') {s.GetChar(); priority = PLow;} else if(c == '!') {s.GetChar(); priority = PHigh;} ParseTypes(s, types); if(s.SkipWhiteSpace() == '#') { s.GetChar(); ParseName(s, name); } if(types.IsEmpty()) { if(name.IsEmpty()) s.ThrowError(_T("syntax error")); types.AddTail(L"?"); } Reference* pRef = pParentRef; while(types.GetCount() > 1) pRef = CreateRef(CreateDef(pRef, types.RemoveHead())); Definition* pDef = NULL; if(!types.IsEmpty()) pDef = CreateDef(pRef, types.RemoveHead(), name, priority); c = s.SkipWhiteSpace(L":="); if(c == '"' || c == '\'') ParseQuotedString(s, pDef); else if(iswdigit(c) || c == '+' || c == '-') ParseNumber(s, pDef); else if(pDef->IsType(L"@")) ParseBlock(s, pDef); else ParseRefs(s, pDef); } s.GetChar(); }
void EvalDefine(const void *data, qCtx *ctx, qStr *out, qArgAry *args) { VALID_ARGM("define", 1); CStr name; qObj *obj = CreateDef(ctx, out, args, name); if (!name.Length()) { if (obj) obj->Free(); return; } if (obj) ctx->MapObj(obj, name); else ctx->DelObj(name); }