|
|
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: }