1 : /*
2 : +----------------------------------------------------------------------+
3 : | PHP Version 5 |
4 : +----------------------------------------------------------------------+
5 : | Copyright (c) 1997-2009 The PHP Group |
6 : +----------------------------------------------------------------------+
7 : | This source file is subject to version 3.01 of the PHP license, |
8 : | that is bundled with this package in the file LICENSE, and is |
9 : | available through the world-wide-web at the following url: |
10 : | http://www.php.net/license/3_01.txt |
11 : | If you did not receive a copy of the PHP license and are unable to |
12 : | obtain it through the world-wide-web, please send a note to |
13 : | license@php.net so we can mail you a copy immediately. |
14 : +----------------------------------------------------------------------+
15 : | Author: Georg Richter <georg@php.net> |
16 : +----------------------------------------------------------------------+
17 :
18 : $Id: mysqli_prop.c 281235 2009-05-27 15:05:28Z andrey $
19 : */
20 :
21 : #ifdef HAVE_CONFIG_H
22 : #include "config.h"
23 : #endif
24 :
25 : #include <signal.h>
26 :
27 : #include "php.h"
28 : #include "php_ini.h"
29 : #include "ext/standard/info.h"
30 : #include "php_mysqli_structs.h"
31 :
32 : #define CHECK_STATUS(value) \
33 : if (!obj->ptr || ((MYSQLI_RESOURCE *)obj->ptr)->status < value ) { \
34 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Property access is not allowed yet"); \
35 : ZVAL_NULL(*retval); \
36 : return SUCCESS; \
37 : } \
38 :
39 : #define MYSQLI_GET_MYSQL(statusval) \
40 : MYSQL *p; \
41 : MAKE_STD_ZVAL(*retval);\
42 : if (!obj->ptr || !(MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr) { \
43 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", obj->zo.ce->name);\
44 : ZVAL_NULL(*retval);\
45 : return SUCCESS; \
46 : } else { \
47 : CHECK_STATUS(statusval);\
48 : p = (MYSQL *)((MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->mysql;\
49 : }
50 :
51 : #define MYSQLI_GET_RESULT(statusval) \
52 : MYSQL_RES *p; \
53 : MAKE_STD_ZVAL(*retval);\
54 : if (!obj->ptr) { \
55 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", obj->zo.ce->name);\
56 : ZVAL_NULL(*retval);\
57 : return SUCCESS; \
58 : } else { \
59 : CHECK_STATUS(statusval);\
60 : p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr; \
61 : }
62 :
63 :
64 : #define MYSQLI_GET_STMT(statusval) \
65 : MYSQL_STMT *p; \
66 : MAKE_STD_ZVAL(*retval);\
67 : if (!obj->ptr) { \
68 : php_error_docref(NULL TSRMLS_CC, E_WARNING, "Couldn't fetch %s", obj->zo.ce->name);\
69 : ZVAL_NULL(*retval);\
70 : return SUCCESS; \
71 : } else { \
72 : CHECK_STATUS(statusval);\
73 : p = (MYSQL_STMT *)((MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr)->stmt;\
74 : }
75 :
76 : #define MYSQLI_MAP_PROPERTY_FUNC_LONG( __func, __int_func, __get_type, __ret_type, __ret_type_sprint_mod)\
77 : static int __func(mysqli_object *obj, zval **retval TSRMLS_DC) \
78 : {\
79 : __ret_type l;\
80 : __get_type;\
81 : if (!p) {\
82 : ZVAL_NULL(*retval);\
83 : } else {\
84 : l = (__ret_type)__int_func(p);\
85 : if (l < LONG_MAX) {\
86 : ZVAL_LONG(*retval, l);\
87 : } else { \
88 : char *ret; \
89 : int ret_len = spprintf(&ret, 0, __ret_type_sprint_mod, l); \
90 : ZVAL_STRINGL(*retval, ret, ret_len, 0); \
91 : } \
92 : }\
93 : return SUCCESS;\
94 : }
95 :
96 : #define MYSQLI_MAP_PROPERTY_FUNC_STRING(__func, __int_func, __get_type)\
97 : static int __func(mysqli_object *obj, zval **retval TSRMLS_DC)\
98 : {\
99 : char *c;\
100 : __get_type;\
101 : if (!p) {\
102 : ZVAL_NULL(*retval);\
103 : } else {\
104 : c = (char *)__int_func(p);\
105 : if (!c) {\
106 : ZVAL_NULL(*retval);\
107 : } else {\
108 : ZVAL_STRING(*retval, c, 1);\
109 : }\
110 : }\
111 : return SUCCESS;\
112 : }
113 :
114 : /* {{{ property link_client_version_read */
115 : static int link_client_version_read(mysqli_object *obj, zval **retval TSRMLS_DC)
116 8 : {
117 8 : MAKE_STD_ZVAL(*retval);
118 8 : ZVAL_LONG(*retval, MYSQL_VERSION_ID);
119 8 : return SUCCESS;
120 : }
121 : /* }}} */
122 :
123 : /* {{{ property link_client_info_read */
124 : static int link_client_info_read(mysqli_object *obj, zval **retval TSRMLS_DC)
125 7 : {
126 7 : MAKE_STD_ZVAL(*retval);
127 7 : CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
128 6 : ZVAL_STRING(*retval, MYSQL_SERVER_VERSION, 1);
129 6 : return SUCCESS;
130 : }
131 : /* }}} */
132 :
133 : /* {{{ property link_connect_errno_read */
134 : static int link_connect_errno_read(mysqli_object *obj, zval **retval TSRMLS_DC)
135 7 : {
136 7 : MAKE_STD_ZVAL(*retval);
137 7 : ZVAL_LONG(*retval, (long)MyG(error_no));
138 7 : return SUCCESS;
139 : }
140 : /* }}} */
141 :
142 : /* {{{ property link_connect_error_read */
143 : static int link_connect_error_read(mysqli_object *obj, zval **retval TSRMLS_DC)
144 7 : {
145 7 : MAKE_STD_ZVAL(*retval);
146 7 : if (MyG(error_msg)) {
147 1 : ZVAL_STRING(*retval, MyG(error_msg), 1);
148 : } else {
149 6 : ZVAL_NULL(*retval);
150 : }
151 7 : return SUCCESS;
152 : }
153 : /* }}} */
154 :
155 : /* {{{ property link_affected_rows_read */
156 : static int link_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
157 21 : {
158 : MY_MYSQL *mysql;
159 : my_ulonglong rc;
160 :
161 21 : MAKE_STD_ZVAL(*retval);
162 :
163 21 : CHECK_STATUS(MYSQLI_STATUS_INITIALIZED);
164 :
165 18 : mysql = (MY_MYSQL *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
166 :
167 18 : if (!mysql) {
168 0 : ZVAL_NULL(*retval);
169 : } else {
170 18 : CHECK_STATUS(MYSQLI_STATUS_VALID);
171 :
172 17 : rc = mysql_affected_rows(mysql->mysql);
173 :
174 17 : if (rc == (my_ulonglong) -1) {
175 2 : ZVAL_LONG(*retval, -1);
176 2 : return SUCCESS;
177 : }
178 :
179 15 : if (rc < LONG_MAX) {
180 15 : ZVAL_LONG(*retval, rc);
181 : } else {
182 : char *ret;
183 0 : int l = spprintf(&ret, 0, MYSQLI_LLU_SPEC, rc);
184 0 : ZVAL_STRINGL(*retval, ret, l, 0);
185 : }
186 : }
187 15 : return SUCCESS;
188 : }
189 : /* }}} */
190 :
191 : /* link properties */
192 28 : MYSQLI_MAP_PROPERTY_FUNC_LONG(link_errno_read, mysql_errno, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED), ulong, "%lu");
193 19 : MYSQLI_MAP_PROPERTY_FUNC_STRING(link_error_read, mysql_error, MYSQLI_GET_MYSQL(MYSQLI_STATUS_INITIALIZED));
194 8 : MYSQLI_MAP_PROPERTY_FUNC_LONG(link_field_count_read, mysql_field_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
195 7 : MYSQLI_MAP_PROPERTY_FUNC_STRING(link_host_info_read, mysql_get_host_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
196 8 : MYSQLI_MAP_PROPERTY_FUNC_STRING(link_info_read, mysql_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
197 13 : MYSQLI_MAP_PROPERTY_FUNC_LONG(link_insert_id_read, mysql_insert_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC);
198 7 : MYSQLI_MAP_PROPERTY_FUNC_LONG(link_protocol_version_read, mysql_get_proto_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
199 7 : MYSQLI_MAP_PROPERTY_FUNC_STRING(link_server_info_read, mysql_get_server_info, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
200 8 : MYSQLI_MAP_PROPERTY_FUNC_LONG(link_server_version_read, mysql_get_server_version, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
201 8 : MYSQLI_MAP_PROPERTY_FUNC_STRING(link_sqlstate_read, mysql_sqlstate, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID));
202 17 : MYSQLI_MAP_PROPERTY_FUNC_LONG(link_thread_id_read, mysql_thread_id, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
203 8 : MYSQLI_MAP_PROPERTY_FUNC_LONG(link_warning_count_read, mysql_warning_count, MYSQLI_GET_MYSQL(MYSQLI_STATUS_VALID), ulong, "%lu");
204 : /* result properties */
205 :
206 : /* {{{ property result_type_read */
207 : static int result_type_read(mysqli_object *obj, zval **retval TSRMLS_DC)
208 6 : {
209 : MYSQL_RES *p;
210 :
211 6 : MAKE_STD_ZVAL(*retval);
212 6 : CHECK_STATUS(MYSQLI_STATUS_VALID);
213 5 : p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
214 :
215 5 : if (!p) {
216 0 : ZVAL_NULL(*retval);
217 : } else {
218 5 : ZVAL_LONG(*retval, mysqli_result_is_unbuffered(p) ? MYSQLI_USE_RESULT:MYSQLI_STORE_RESULT);
219 : }
220 5 : return SUCCESS;
221 : }
222 : /* }}} */
223 :
224 : /* {{{ property result_lengths_read */
225 : static int result_lengths_read(mysqli_object *obj, zval **retval TSRMLS_DC)
226 9 : {
227 : MYSQL_RES *p;
228 : ulong *ret;
229 :
230 9 : MAKE_STD_ZVAL(*retval);
231 :
232 9 : CHECK_STATUS(MYSQLI_STATUS_VALID);
233 7 : p = (MYSQL_RES *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
234 9 : if (!p || !p->field_count || !(ret = mysql_fetch_lengths(p))) {
235 2 : ZVAL_NULL(*retval);
236 : } else {
237 : ulong i;
238 :
239 5 : array_init(*retval);
240 :
241 15 : for (i = 0; i < p->field_count; i++) {
242 10 : add_index_long(*retval, i, ret[i]);
243 : }
244 : }
245 7 : return SUCCESS;
246 : }
247 : /* }}} */
248 :
249 :
250 6 : MYSQLI_MAP_PROPERTY_FUNC_LONG(result_current_field_read, mysql_field_tell, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), ulong, "%lu");
251 9 : MYSQLI_MAP_PROPERTY_FUNC_LONG(result_field_count_read, mysql_num_fields, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), ulong, "%lu");
252 9 : MYSQLI_MAP_PROPERTY_FUNC_LONG(result_num_rows_read, mysql_num_rows, MYSQLI_GET_RESULT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC);
253 :
254 : /* statement properties */
255 :
256 : /* {{{ property stmt_id_read */
257 : static int stmt_id_read(mysqli_object *obj, zval **retval TSRMLS_DC)
258 3 : {
259 : MY_STMT *p;
260 :
261 3 : MAKE_STD_ZVAL(*retval);
262 3 : CHECK_STATUS(MYSQLI_STATUS_VALID);
263 :
264 3 : p = (MY_STMT*)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
265 :
266 3 : if (!p) {
267 0 : ZVAL_NULL(*retval);
268 : } else {
269 3 : ZVAL_LONG(*retval, p->stmt->stmt_id);
270 : }
271 3 : return SUCCESS;
272 : }
273 : /* }}} */
274 :
275 : /* {{{ property stmt_affected_rows_read */
276 : static int stmt_affected_rows_read(mysqli_object *obj, zval **retval TSRMLS_DC)
277 6 : {
278 : MY_STMT *p;
279 : my_ulonglong rc;
280 :
281 6 : MAKE_STD_ZVAL(*retval);
282 6 : CHECK_STATUS(MYSQLI_STATUS_VALID);
283 :
284 4 : p = (MY_STMT *)((MYSQLI_RESOURCE *)(obj->ptr))->ptr;
285 :
286 4 : if (!p) {
287 0 : ZVAL_NULL(*retval);
288 : } else {
289 4 : rc = mysql_stmt_affected_rows(p->stmt);
290 :
291 4 : if (rc == (my_ulonglong) -1) {
292 2 : ZVAL_LONG(*retval, -1);
293 2 : return SUCCESS;
294 : }
295 :
296 2 : if (rc < LONG_MAX) {
297 2 : ZVAL_LONG(*retval, rc);
298 : } else {
299 : char *ret;
300 0 : int l = spprintf(&ret, 0, MYSQLI_LLU_SPEC, rc);
301 0 : ZVAL_STRINGL(*retval, ret, l, 0);
302 : }
303 : }
304 2 : return SUCCESS;
305 : }
306 : /* }}} */
307 :
308 4 : MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_insert_id_read, mysql_stmt_insert_id, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC);
309 3 : MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_num_rows_read, mysql_stmt_num_rows, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), my_ulonglong, MYSQLI_LLU_SPEC);
310 3 : MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_param_count_read, mysql_stmt_param_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), ulong, "%lu");
311 4 : MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_field_count_read, mysql_stmt_field_count, MYSQLI_GET_STMT(MYSQLI_STATUS_VALID), ulong, "%lu");
312 4 : MYSQLI_MAP_PROPERTY_FUNC_LONG(stmt_errno_read, mysql_stmt_errno, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED), ulong, "%lu");
313 3 : MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_error_read, mysql_stmt_error, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED));
314 3 : MYSQLI_MAP_PROPERTY_FUNC_STRING(stmt_sqlstate_read, mysql_stmt_sqlstate, MYSQLI_GET_STMT(MYSQLI_STATUS_INITIALIZED));
315 :
316 : /* }}} */
317 : const mysqli_property_entry mysqli_link_property_entries[] = {
318 : {"affected_rows", sizeof("affected_rows") - 1, link_affected_rows_read, NULL},
319 : {"client_info", sizeof("client_info") - 1, link_client_info_read, NULL},
320 : {"client_version", sizeof("client_version") - 1, link_client_version_read, NULL},
321 : {"connect_errno", sizeof("connect_errno") - 1, link_connect_errno_read, NULL},
322 : {"connect_error", sizeof("connect_error") - 1, link_connect_error_read, NULL},
323 : {"errno", sizeof("errno") - 1, link_errno_read, NULL},
324 : {"error", sizeof("error") - 1, link_error_read, NULL},
325 : {"field_count", sizeof("field_count") - 1, link_field_count_read, NULL},
326 : {"host_info", sizeof("host_info") - 1, link_host_info_read, NULL},
327 : {"info", sizeof("info") - 1, link_info_read, NULL},
328 : {"insert_id", sizeof("insert_id") - 1, link_insert_id_read, NULL},
329 : {"server_info", sizeof("server_info") - 1, link_server_info_read, NULL},
330 : {"server_version", sizeof("server_version") - 1, link_server_version_read, NULL},
331 : {"sqlstate", sizeof("sqlstate") - 1, link_sqlstate_read, NULL},
332 : {"protocol_version",sizeof("protocol_version") - 1, link_protocol_version_read, NULL},
333 : {"thread_id", sizeof("thread_id") - 1, link_thread_id_read, NULL},
334 : {"warning_count", sizeof("warning_count") - 1, link_warning_count_read, NULL},
335 : {NULL, 0, NULL, NULL}
336 : };
337 :
338 : /* should not be const, as it is patched during runtime */
339 : zend_property_info mysqli_link_property_info_entries[] = {
340 : {ZEND_ACC_PUBLIC, "affected_rows", sizeof("affected_rows") - 1, 0, NULL, 0, NULL},
341 : {ZEND_ACC_PUBLIC, "client_info", sizeof("client_info") - 1, 0, NULL, 0, NULL},
342 : {ZEND_ACC_PUBLIC, "client_version", sizeof("client_version") - 1, 0, NULL, 0, NULL},
343 : {ZEND_ACC_PUBLIC, "connect_errno", sizeof("connect_errno") - 1, 0, NULL, 0, NULL},
344 : {ZEND_ACC_PUBLIC, "connect_error", sizeof("connect_error") - 1, 0, NULL, 0, NULL},
345 : {ZEND_ACC_PUBLIC, "errno", sizeof("errno") - 1, 0, NULL, 0, NULL},
346 : {ZEND_ACC_PUBLIC, "error", sizeof("error") - 1, 0, NULL, 0, NULL},
347 : {ZEND_ACC_PUBLIC, "field_count", sizeof("field_count") - 1, 0, NULL, 0, NULL},
348 : {ZEND_ACC_PUBLIC, "host_info", sizeof("host_info") - 1, 0, NULL, 0, NULL},
349 : {ZEND_ACC_PUBLIC, "info", sizeof("info") - 1, 0, NULL, 0, NULL},
350 : {ZEND_ACC_PUBLIC, "insert_id", sizeof("insert_id") - 1, 0, NULL, 0, NULL},
351 : {ZEND_ACC_PUBLIC, "server_info", sizeof("server_info") - 1, 0, NULL, 0, NULL},
352 : {ZEND_ACC_PUBLIC, "server_version", sizeof("server_version") - 1, 0, NULL, 0, NULL},
353 : {ZEND_ACC_PUBLIC, "sqlstate", sizeof("sqlstate") - 1, 0, NULL, 0, NULL},
354 : {ZEND_ACC_PUBLIC, "protocol_version", sizeof("protocol_version")-1, 0, NULL, 0, NULL},
355 : {ZEND_ACC_PUBLIC, "thread_id", sizeof("thread_id") - 1, 0, NULL, 0, NULL},
356 : {ZEND_ACC_PUBLIC, "warning_count", sizeof("warning_count") - 1, 0, NULL, 0, NULL},
357 : {0, NULL, 0, 0, NULL, 0, NULL}
358 : };
359 :
360 :
361 : const mysqli_property_entry mysqli_result_property_entries[] = {
362 : {"current_field",sizeof("current_field")-1, result_current_field_read, NULL},
363 : {"field_count", sizeof("field_count") - 1, result_field_count_read, NULL},
364 : {"lengths", sizeof("lengths") - 1, result_lengths_read, NULL},
365 : {"num_rows", sizeof("num_rows") - 1, result_num_rows_read, NULL},
366 : {"type", sizeof("type") - 1, result_type_read, NULL},
367 : {NULL, 0, NULL, NULL}
368 : };
369 :
370 : zend_property_info mysqli_result_property_info_entries[] = {
371 : {ZEND_ACC_PUBLIC, "current_field", sizeof("current_field")-1, 0, NULL, 0, NULL},
372 : {ZEND_ACC_PUBLIC, "field_count", sizeof("field_count") - 1, 0, NULL, 0, NULL},
373 : {ZEND_ACC_PUBLIC, "lengths", sizeof("lengths") - 1, 0, NULL, 0, NULL},
374 : {ZEND_ACC_PUBLIC, "num_rows", sizeof("num_rows") - 1, 0, NULL, 0, NULL},
375 : {ZEND_ACC_PUBLIC, "type", sizeof("type") - 1, 0, NULL, 0, NULL},
376 : {0, NULL, 0, 0, NULL, 0, NULL}
377 : };
378 :
379 : const mysqli_property_entry mysqli_stmt_property_entries[] = {
380 : {"affected_rows", sizeof("affected_rows")-1,stmt_affected_rows_read, NULL},
381 : {"insert_id", sizeof("insert_id") - 1, stmt_insert_id_read, NULL},
382 : {"num_rows", sizeof("num_rows") - 1, stmt_num_rows_read, NULL},
383 : {"param_count", sizeof("param_count") - 1, stmt_param_count_read, NULL},
384 : {"field_count", sizeof("field_count") - 1, stmt_field_count_read, NULL},
385 : {"errno", sizeof("errno") - 1, stmt_errno_read, NULL},
386 : {"error", sizeof("error") - 1, stmt_error_read, NULL},
387 : {"sqlstate", sizeof("sqlstate") - 1, stmt_sqlstate_read, NULL},
388 : {"id", sizeof("id") - 1, stmt_id_read, NULL},
389 : {NULL, 0, NULL, NULL}
390 : };
391 :
392 :
393 : zend_property_info mysqli_stmt_property_info_entries[] = {
394 : {ZEND_ACC_PUBLIC, "affected_rows", sizeof("affected_rows") - 1, 0, NULL, 0, NULL},
395 : {ZEND_ACC_PUBLIC, "insert_id", sizeof("insert_id") - 1, 0, NULL, 0, NULL},
396 : {ZEND_ACC_PUBLIC, "num_rows", sizeof("num_rows") - 1, 0, NULL, 0, NULL},
397 : {ZEND_ACC_PUBLIC, "param_count",sizeof("param_count") - 1, 0, NULL, 0, NULL},
398 : {ZEND_ACC_PUBLIC, "field_count",sizeof("field_count") - 1, 0, NULL, 0, NULL},
399 : {ZEND_ACC_PUBLIC, "errno", sizeof("errno") - 1, 0, NULL, 0, NULL},
400 : {ZEND_ACC_PUBLIC, "error", sizeof("error") - 1, 0, NULL, 0, NULL},
401 : {ZEND_ACC_PUBLIC, "sqlstate", sizeof("sqlstate") - 1, 0, NULL, 0, NULL},
402 : {ZEND_ACC_PUBLIC, "id", sizeof("id") - 1, 0, NULL, 0, NULL},
403 : {0, NULL, 0, 0, NULL, 0, NULL}
404 : };
405 :
406 : /*
407 : * Local variables:
408 : * tab-width: 4
409 : * c-basic-offset: 4
410 : * End:
411 : * vim600: noet sw=4 ts=4 fdm=marker
412 : * vim<600: noet sw=4 ts=4
413 : */
|