Annotation of parser3/src/types/pa_venv.C, revision 1.14
1.2 paf 1: /** @file
2: Parser: @b env class.
3:
1.12 moko 4: Copyright (c) 2001-2012 Art. Lebedev Studio (http://www.artlebedev.com)
1.2 paf 5: Author: Alexandr Petrosian <paf@design.ru> (http://paf.design.ru)
6: */
7:
8: #include "pa_venv.h"
9: #include "pa_vstring.h"
1.13 misha 10: #include "pa_vhash.h"
1.2 paf 11: #include "pa_version.h"
12:
1.14 ! misha 13: volatile const char * IDENT_PA_PA_VENV_C="$Id: pa_venv.C,v 1.13 2013/03/09 05:39:41 misha Exp $" IDENT_PA_VENV_H;
1.12 moko 14:
1.4 misha 15: #define PARSER_VERSION_ELEMENT_NAME "PARSER_VERSION"
1.13 misha 16: #define ENV_FIELDS_ELEMENT_NAME "fields"
1.4 misha 17:
1.2 paf 18: static const String parser_version(PARSER_VERSION);
19:
1.11 misha 20: Value* VEnv::get_element(const String& aname) {
1.14 ! misha 21: #ifndef OPTIMIZE_BYTECODE_GET_ELEMENT__SPECIAL
1.6 misha 22: // $env:CLASS
1.5 misha 23: if(aname==CLASS_NAME)
24: return this;
25:
1.6 misha 26: // $env:CLASS_NAME
1.5 misha 27: if(aname==CLASS_NAMETEXT)
28: return new VString(env_class_name);
1.14 ! misha 29: #endif
1.5 misha 30:
1.2 paf 31: // $env:PARSER_VERSION
1.4 misha 32: if(aname==PARSER_VERSION_ELEMENT_NAME)
1.2 paf 33: return new VString(parser_version);
34:
1.13 misha 35: // $fields
36: if(aname==ENV_FIELDS_ELEMENT_NAME){
37: HashStringValue *result=new HashStringValue();
38: if(const char *const *pairs=SAPI::environment(finfo)) {
39: while(const char* pair=*pairs++)
40: if(const char* eq_at=strchr(pair, '='))
41: if(eq_at[1]) // has value
42: result->put(
43: pa_strdup(pair, eq_at-pair),
44: new VString(*new String(pa_strdup(eq_at+1), String::L_TAINTED)));
45: }
46: return new VHash(*result);
47: }
48:
1.6 misha 49: // $env:field
1.7 misha 50: if(const char* value=SAPI::get_env(finfo, aname.cstr())){
1.10 misha 51: return new VString(*new String(strdup(value, strlen(value)), String::L_TAINTED));
1.7 misha 52: }
1.6 misha 53:
54: return 0;
1.3 paf 55: }
E-mail: