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: