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: