Annotation of parser3/src/classes/inet.C, revision 1.1

1.1     ! misha       1: /** @file
        !             2:        Parser: @b inet parser class.
        !             3: 
        !             4:        Copyright(c) 2001-2005 ArtLebedev Group(http://www.artlebedev.com)
        !             5:        Author: Alexandr Petrosian <paf@design.ru>(http://paf.design.ru)
        !             6: */
        !             7: 
        !             8: static const char * const IDENT_INET_C="$Date: 2007/08/20 10:37:21 $";
        !             9: 
        !            10: #include "pa_vmethod_frame.h"
        !            11: #include "pa_request.h"
        !            12: 
        !            13: class MInet: public Methoded {
        !            14: public:
        !            15:        MInet();
        !            16: 
        !            17: public: // Methoded
        !            18:        bool used_directly() { return true; }
        !            19: };
        !            20: 
        !            21: // global variables
        !            22: 
        !            23: DECLARE_CLASS_VAR(inet, new MInet, 0);
        !            24: 
        !            25: 
        !            26: static void _ntoa(Request& r, MethodParams& params){
        !            27:        unsigned long l=(unsigned long)trunc(params.as_double(0, "parameter must be expression", r));
        !            28:        static const int ip_cstr_bufsize=3*4+3+1;
        !            29:        char* ip_cstr=new(PointerFreeGC) char[ip_cstr_bufsize];
        !            30: 
        !            31:        snprintf(ip_cstr, ip_cstr_bufsize, "%u.%u.%u.%u",
        !            32:                                (l>>24) & 0xFF,
        !            33:                                (l>>16) & 0xFF,
        !            34:                                (l>>8) & 0xFF,
        !            35:                                l & 0xFF);
        !            36: 
        !            37:        r.write_no_lang(*new String(ip_cstr));
        !            38: }
        !            39: 
        !            40: static void _aton(Request& r, MethodParams& params){
        !            41:        const String ip=params.as_string(0, PARAMETER_MUST_BE_STRING);
        !            42:        if(ip.is_empty())
        !            43:                throw Exception(PARSER_RUNTIME,
        !            44:                        0,
        !            45:                        "IP address must not be empty.");
        !            46: 
        !            47:        const char* ip_cstr=ip.cstr();
        !            48:        ulong result=0;
        !            49:        uint byte_value=0;
        !            50:        uint dot_cnt=0;
        !            51:        bool byte_start=true;
        !            52:        bool err=false;
        !            53:        const char* p=ip_cstr;
        !            54:        while(char c=*p++){
        !            55:                uint digit=(uint)(c-'0');       // assume ascii
        !            56:                if(digit>=0 && digit<=9){
        !            57:                        byte_start=false;
        !            58:                        if((byte_value=byte_value*10+digit) > 255){
        !            59:                                err=true;
        !            60:                                break;
        !            61:                        }
        !            62:                } else if(c=='.'){
        !            63:                        if(byte_start){ // two dots in row or IP started with dot
        !            64:                                err=true;
        !            65:                                break;
        !            66:                        } else {
        !            67:                                byte_start=true;
        !            68:                                dot_cnt++;
        !            69:                                result=(result << 8)+(ulong)byte_value;
        !            70:                                byte_value=0;
        !            71:                        }
        !            72:                } else { // invalid char
        !            73:                        err=true;
        !            74:                        break;
        !            75:                }
        !            76:        }
        !            77: 
        !            78:        if(err || dot_cnt!=3 || byte_start){
        !            79:                throw Exception(PARSER_RUNTIME,
        !            80:                        0,
        !            81:                        "Invalid IP address '%s' specified.", ip_cstr);
        !            82:        } else {
        !            83:                result=(result << 8)+(ulong)byte_value;
        !            84:                r.write_no_lang(*new VDouble(result));
        !            85:        }
        !            86: }
        !            87: 
        !            88: // constructor
        !            89: MInet::MInet(): Methoded("inet") {
        !            90:        add_native_method("ntoa", Method::CT_STATIC, _ntoa, 1, 1);
        !            91:        add_native_method("aton", Method::CT_STATIC, _aton, 1, 1);
        !            92: 
        !            93:        // todo: gethostbyname, gethostbyaddr
        !            94: }

E-mail: