Annotation of parser3/src/classes/string.C, revision 1.16

1.1       paf         1: /*
1.4       paf         2:        Parser
                      3:        Copyright (c) 2001 ArtLebedev Group (http://www.artlebedev.com)
1.5       paf         4:        Author: Alexander Petrosyan <paf@design.ru> (http://design.ru/paf)
1.4       paf         5: 
1.16    ! paf         6:        $Id: string.C,v 1.15 2001/03/29 15:00:19 paf Exp $
1.1       paf         7: */
                      8: 
                      9: #include "pa_request.h"
                     10: #include "_string.h"
                     11: #include "pa_vdouble.h"
                     12: #include "pa_vint.h"
                     13: 
                     14: // global var
                     15: 
1.10      paf        16: VStateless_class *string_class;
1.1       paf        17: 
                     18: // methods
                     19: 
1.7       paf        20: static void _length(Request& r, const String&, Array *) {
1.1       paf        21:        Pool& pool=r.pool();
1.15      paf        22:        Value& value=*new(pool) VDouble(pool, r.self->get_string()->size());
1.11      paf        23:        r.write_no_lang(value);
1.1       paf        24: }
                     25: 
1.7       paf        26: static void _int(Request& r, const String&, Array *) {
1.1       paf        27:        Pool& pool=r.pool();
1.13      paf        28:        Value& value=*new(pool) VInt(pool, (int)r.self->as_double());
1.11      paf        29:        r.write_no_lang(value);
1.1       paf        30: }
                     31: 
1.7       paf        32: static void _double(Request& r, const String&, Array *) {
1.1       paf        33:        Pool& pool=r.pool();
1.13      paf        34:        Value& value=*new(pool) VDouble(pool, r.self->as_double());
1.11      paf        35:        r.write_no_lang(value);
1.1       paf        36: }
                     37: 
1.9       paf        38: void _string_format(Request& r, const String& method_name, Array *params) {
                     39:        Pool& pool=r.pool();
                     40: 
                     41:        Value& fmt=*static_cast<Value *>(params->get(0));
                     42:        // forcing ^format[this param type]
1.16    ! paf        43:        r.fail_if_junction_(true, fmt, method_name, "fmt must not be junction");
1.9       paf        44: 
1.13      paf        45:        char *buf=format(pool, r.self->as_double(), fmt.as_string().cstr());
1.9       paf        46:        
1.12      paf        47:        r.write_no_lang(String(pool, buf));
1.9       paf        48: }
1.11      paf        49: 
1.16    ! paf        50: void _left(Request& r, const String&, Array *params) {
1.15      paf        51:        Pool& pool=r.pool();
                     52: 
                     53:        size_t n=(size_t)r.process(*static_cast<Value *>(params->get(0))).as_double();
                     54:        
                     55:        const String& string=*static_cast<VString *>(r.self)->get_string();
                     56:        r.write_assign_lang(*new(pool) VString(string.piece(0, n)));
                     57: }
                     58: 
1.16    ! paf        59: void _right(Request& r, const String&, Array *params) {
1.15      paf        60:        Pool& pool=r.pool();
                     61: 
                     62:        size_t n=(size_t)r.process(*static_cast<Value *>(params->get(0))).as_double();
                     63:        
                     64:        const String& string=*static_cast<VString *>(r.self)->get_string();
                     65:        r.write_assign_lang(*new(pool) VString(string.piece(string.size()-n, string.size())));
                     66: }
                     67: 
1.16    ! paf        68: void _mid(Request& r, const String&, Array *params) {
1.15      paf        69:        Pool& pool=r.pool();
                     70: 
                     71:        size_t p=(size_t)r.process(*static_cast<Value *>(params->get(0))).as_double();
                     72:        size_t n=(size_t)r.process(*static_cast<Value *>(params->get(1))).as_double();
                     73:        
                     74:        const String& string=*static_cast<VString *>(r.self)->get_string();
                     75:        r.write_assign_lang(*new(pool) VString(string.piece(p, p+n)));
                     76: }
                     77: 
1.16    ! paf        78: void _pos(Request& r, const String& method_name, Array *params) {
        !            79:        Pool& pool=r.pool();
        !            80: 
        !            81:        Value& substr=*static_cast<Value *>(params->get(0));
        !            82:        // forcing ^pos[this param type]
        !            83:        r.fail_if_junction_(true, substr, method_name, "substr must not be junction");
        !            84:        
        !            85:        const String& string=*static_cast<VString *>(r.self)->get_string();
        !            86:        r.write_assign_lang(*new(pool) VInt(pool, string.pos(substr.as_string())));
        !            87: }
        !            88: 
1.11      paf        89: // initialize
1.9       paf        90: 
1.10      paf        91: void initialize_string_class(Pool& pool, VStateless_class& vclass) {
1.1       paf        92:        // ^string.length[]
1.6       paf        93:        vclass.add_native_method("length", _length, 0, 0);
                     94:        
1.1       paf        95:        // ^string.int[]
1.6       paf        96:        vclass.add_native_method("int", _int, 0, 0);
                     97:        
1.1       paf        98:        // ^string.double[]
1.6       paf        99:        vclass.add_native_method("double", _double, 0, 0);
1.9       paf       100: 
                    101:        // ^string.format[]
                    102:        vclass.add_native_method("format", _string_format, 1, 1);
1.14      paf       103: 
1.15      paf       104:        // ^string.left(n)
                    105:        vclass.add_native_method("left", _left, 1, 1);
                    106:        // ^string.right(n)
                    107:        vclass.add_native_method("right", _right, 1, 1);
                    108:        // ^string.mid(p;n)
                    109:        vclass.add_native_method("mid", _mid, 2, 2);
1.16    ! paf       110: 
        !           111:        // ^string.pos[substr]
        !           112:        vclass.add_native_method("pos", _pos, 1, 1);
1.2       paf       113: }      
1.1       paf       114: 

E-mail: