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

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

E-mail: