Return to enchant.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / enchant |
1.1 ! misho 1: /* ! 2: +----------------------------------------------------------------------+ ! 3: | PHP Version 5 | ! 4: +----------------------------------------------------------------------+ ! 5: | Copyright (c) 1997-2012 The PHP Group | ! 6: +----------------------------------------------------------------------+ ! 7: | This source file is subject to version 3.0 of the PHP license, | ! 8: | that is bundled with this package in the file LICENSE, and is | ! 9: | available at through the world-wide-web at | ! 10: | http://www.php.net/license/3_0.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: Pierre-Alain Joye <paj@pearfr.org> | ! 16: | Ilia Alshanetsky <ilia@prohost.org> | ! 17: +----------------------------------------------------------------------+ ! 18: ! 19: $Id: enchant.c 321634 2012-01-01 13:15:04Z felipe $ ! 20: */ ! 21: ! 22: #ifdef HAVE_CONFIG_H ! 23: #include "config.h" ! 24: #endif ! 25: ! 26: #include <enchant.h> ! 27: #include "php.h" ! 28: #include "php_ini.h" ! 29: #include "ext/standard/info.h" ! 30: #include "php_enchant.h" ! 31: ! 32: typedef EnchantBroker * EnchantBrokerPtr; ! 33: typedef struct _broker_struct enchant_broker; ! 34: typedef struct _dict_struct enchant_dict; ! 35: ! 36: typedef enchant_broker * enchant_brokerPtr; ! 37: typedef enchant_dict * enchant_dictPtr; ! 38: ! 39: typedef struct _broker_struct { ! 40: EnchantBroker *pbroker; ! 41: enchant_dict **dict; ! 42: unsigned int dictcnt; ! 43: long rsrc_id; ! 44: } _enchant_broker; ! 45: ! 46: typedef struct _dict_struct { ! 47: unsigned int id; ! 48: EnchantDict *pdict; ! 49: enchant_broker *pbroker; ! 50: long rsrc_id; ! 51: enchant_dict *next; ! 52: enchant_dict *prev; ! 53: } _enchant_dict; ! 54: ! 55: ! 56: /* True global resources - no need for thread safety here */ ! 57: static int le_enchant_broker; ! 58: static int le_enchant_dict; ! 59: ! 60: /* If you declare any globals in php_enchant.h uncomment this:*/ ! 61: /*ZEND_DECLARE_MODULE_GLOBALS(enchant)*/ ! 62: ! 63: #define PHP_ENCHANT_MYSPELL 1 ! 64: #define PHP_ENCHANT_ISPELL 2 ! 65: ! 66: /* {{{ arginfo */ ! 67: ZEND_BEGIN_ARG_INFO(arginfo_enchant_broker_init, 0) ! 68: ZEND_END_ARG_INFO() ! 69: ! 70: ZEND_BEGIN_ARG_INFO_EX(arginfo_enchant_broker_free, 0, 0, 1) ! 71: ZEND_ARG_INFO(0, broker) ! 72: ZEND_END_ARG_INFO() ! 73: ! 74: ZEND_BEGIN_ARG_INFO_EX(arginfo_enchant_broker_set_dict_path, 0, 0, 3) ! 75: ZEND_ARG_INFO(0, broker) ! 76: ZEND_ARG_INFO(0, name) ! 77: ZEND_ARG_INFO(0, value) ! 78: ZEND_END_ARG_INFO() ! 79: ! 80: ZEND_BEGIN_ARG_INFO_EX(arginfo_enchant_broker_get_dict_path, 0, 0, 2) ! 81: ZEND_ARG_INFO(0, broker) ! 82: ZEND_ARG_INFO(0, name) ! 83: ZEND_END_ARG_INFO() ! 84: ! 85: ZEND_BEGIN_ARG_INFO_EX(arginfo_enchant_broker_request_dict, 0, 0, 2) ! 86: ZEND_ARG_INFO(0, broker) ! 87: ZEND_ARG_INFO(0, tag) ! 88: ZEND_END_ARG_INFO() ! 89: ! 90: ZEND_BEGIN_ARG_INFO_EX(arginfo_enchant_broker_request_pwl_dict, 0, 0, 2) ! 91: ZEND_ARG_INFO(0, broker) ! 92: ZEND_ARG_INFO(0, filename) ! 93: ZEND_END_ARG_INFO() ! 94: ! 95: ZEND_BEGIN_ARG_INFO_EX(arginfo_enchant_broker_free_dict, 0, 0, 1) ! 96: ZEND_ARG_INFO(0, dict) ! 97: ZEND_END_ARG_INFO() ! 98: ! 99: ZEND_BEGIN_ARG_INFO_EX(arginfo_enchant_broker_set_ordering, 0, 0, 3) ! 100: ZEND_ARG_INFO(0, broker) ! 101: ZEND_ARG_INFO(0, tag) ! 102: ZEND_ARG_INFO(0, ordering) ! 103: ZEND_END_ARG_INFO() ! 104: ! 105: ZEND_BEGIN_ARG_INFO_EX(arginfo_enchant_dict_quick_check, 0, 0, 2) ! 106: ZEND_ARG_INFO(0, dict) ! 107: ZEND_ARG_INFO(0, word) ! 108: ZEND_ARG_INFO(1, suggestions) ! 109: ZEND_END_ARG_INFO() ! 110: ! 111: ZEND_BEGIN_ARG_INFO_EX(arginfo_enchant_dict_check, 0, 0, 2) ! 112: ZEND_ARG_INFO(0, dict) ! 113: ZEND_ARG_INFO(0, word) ! 114: ZEND_END_ARG_INFO() ! 115: ! 116: ZEND_BEGIN_ARG_INFO_EX(arginfo_enchant_dict_store_replacement, 0, 0, 3) ! 117: ZEND_ARG_INFO(0, dict) ! 118: ZEND_ARG_INFO(0, mis) ! 119: ZEND_ARG_INFO(0, cor) ! 120: ZEND_END_ARG_INFO() ! 121: /* }}} */ ! 122: ! 123: /* {{{ enchant_functions[] ! 124: * ! 125: * Every user visible function must have an entry in enchant_functions[]. ! 126: */ ! 127: function_entry enchant_functions[] = { ! 128: PHP_FE(enchant_broker_init, arginfo_enchant_broker_init) ! 129: PHP_FE(enchant_broker_free, arginfo_enchant_broker_free) ! 130: PHP_FE(enchant_broker_get_error, arginfo_enchant_broker_free) ! 131: PHP_FE(enchant_broker_set_dict_path, arginfo_enchant_broker_set_dict_path) ! 132: PHP_FE(enchant_broker_get_dict_path, arginfo_enchant_broker_get_dict_path) ! 133: PHP_FE(enchant_broker_list_dicts, arginfo_enchant_broker_free) ! 134: PHP_FE(enchant_broker_request_dict, arginfo_enchant_broker_request_dict) ! 135: PHP_FE(enchant_broker_request_pwl_dict, arginfo_enchant_broker_request_pwl_dict) ! 136: PHP_FE(enchant_broker_free_dict, arginfo_enchant_broker_free_dict) ! 137: PHP_FE(enchant_broker_dict_exists, arginfo_enchant_broker_request_dict) ! 138: PHP_FE(enchant_broker_set_ordering, arginfo_enchant_broker_set_ordering) ! 139: PHP_FE(enchant_broker_describe, arginfo_enchant_broker_free) ! 140: PHP_FE(enchant_dict_check, arginfo_enchant_dict_check) ! 141: PHP_FE(enchant_dict_suggest, arginfo_enchant_dict_check) ! 142: PHP_FE(enchant_dict_add_to_personal, arginfo_enchant_dict_check) ! 143: PHP_FE(enchant_dict_add_to_session, arginfo_enchant_dict_check) ! 144: PHP_FE(enchant_dict_is_in_session, arginfo_enchant_dict_check) ! 145: PHP_FE(enchant_dict_store_replacement, arginfo_enchant_dict_store_replacement) ! 146: PHP_FE(enchant_dict_get_error, arginfo_enchant_broker_free_dict) ! 147: PHP_FE(enchant_dict_describe, arginfo_enchant_broker_free_dict) ! 148: PHP_FE(enchant_dict_quick_check, arginfo_enchant_dict_quick_check) ! 149: PHP_FE_END ! 150: }; ! 151: /* }}} */ ! 152: ! 153: /* {{{ enchant_module_entry ! 154: */ ! 155: zend_module_entry enchant_module_entry = { ! 156: #if ZEND_MODULE_API_NO >= 20010901 ! 157: STANDARD_MODULE_HEADER, ! 158: #endif ! 159: "enchant", ! 160: enchant_functions, ! 161: PHP_MINIT(enchant), ! 162: PHP_MSHUTDOWN(enchant), ! 163: NULL, /* Replace with NULL if there's nothing to do at request start */ ! 164: NULL, /* Replace with NULL if there's nothing to do at request end */ ! 165: PHP_MINFO(enchant), ! 166: #if ZEND_MODULE_API_NO >= 20010901 ! 167: PHP_ENCHANT_VERSION, ! 168: #endif ! 169: STANDARD_MODULE_PROPERTIES ! 170: }; ! 171: /* }}} */ ! 172: ! 173: #ifdef COMPILE_DL_ENCHANT ! 174: ZEND_GET_MODULE(enchant) ! 175: #endif ! 176: ! 177: static void ! 178: enumerate_providers_fn (const char * const name, ! 179: const char * const desc, ! 180: const char * const file, ! 181: void * ud) /* {{{ */ ! 182: { ! 183: zval *zdesc = (zval *) ud; ! 184: zval *tmp_array; ! 185: ! 186: MAKE_STD_ZVAL(tmp_array); ! 187: array_init(tmp_array); ! 188: ! 189: add_assoc_string(tmp_array, "name", (char *)name, 1); ! 190: add_assoc_string(tmp_array, "desc", (char *)desc, 1); ! 191: add_assoc_string(tmp_array, "file", (char *)file, 1); ! 192: ! 193: if (Z_TYPE_P(zdesc)!=IS_ARRAY) { ! 194: array_init(zdesc); ! 195: } ! 196: ! 197: add_next_index_zval(zdesc, tmp_array); ! 198: } ! 199: /* }}} */ ! 200: ! 201: static void ! 202: describe_dict_fn (const char * const lang, ! 203: const char * const name, ! 204: const char * const desc, ! 205: const char * const file, ! 206: void * ud) /* {{{ */ ! 207: { ! 208: zval *zdesc = (zval *) ud; ! 209: array_init(zdesc); ! 210: add_assoc_string(zdesc, "lang", (char *)lang, 1); ! 211: add_assoc_string(zdesc, "name", (char *)name, 1); ! 212: add_assoc_string(zdesc, "desc", (char *)desc, 1); ! 213: add_assoc_string(zdesc, "file", (char *)file, 1); ! 214: } ! 215: /* }}} */ ! 216: ! 217: static void php_enchant_list_dicts_fn( const char * const lang_tag, ! 218: const char * const provider_name, const char * const provider_desc, ! 219: const char * const provider_file, void * ud) /* {{{ */ ! 220: { ! 221: zval *zdesc = (zval *) ud; ! 222: zval *tmp_array; ! 223: ! 224: MAKE_STD_ZVAL(tmp_array); ! 225: array_init(tmp_array); ! 226: add_assoc_string(tmp_array, "lang_tag", (char *)lang_tag, 1); ! 227: add_assoc_string(tmp_array, "provider_name", (char *)provider_name, 1); ! 228: add_assoc_string(tmp_array, "provider_desc", (char *)provider_desc, 1); ! 229: add_assoc_string(tmp_array, "provider_file", (char *)provider_file, 1); ! 230: ! 231: if (Z_TYPE_P(zdesc) != IS_ARRAY) { ! 232: array_init(zdesc); ! 233: } ! 234: add_next_index_zval(zdesc, tmp_array); ! 235: ! 236: } ! 237: /* }}} */ ! 238: ! 239: static void php_enchant_broker_free(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */ ! 240: { ! 241: if (rsrc->ptr) { ! 242: enchant_broker *broker = (enchant_broker *)rsrc->ptr; ! 243: if (broker) { ! 244: if (broker->pbroker) { ! 245: if (broker->dictcnt && broker->dict) { ! 246: if (broker->dict) { ! 247: int total, tofree; ! 248: tofree = total = broker->dictcnt-1; ! 249: do { ! 250: zend_list_delete(broker->dict[total]->rsrc_id); ! 251: efree(broker->dict[total]); ! 252: total--; ! 253: } while (total>=0); ! 254: } ! 255: efree(broker->dict); ! 256: broker->dict = NULL; ! 257: } ! 258: enchant_broker_free(broker->pbroker); ! 259: } ! 260: efree(broker); ! 261: } ! 262: } ! 263: } ! 264: /* }}} */ ! 265: ! 266: static void php_enchant_dict_free(zend_rsrc_list_entry *rsrc TSRMLS_DC) /* {{{ */ ! 267: ! 268: { ! 269: if (rsrc->ptr) { ! 270: enchant_dict *pdict = (enchant_dict *)rsrc->ptr; ! 271: if (pdict) { ! 272: if (pdict->pdict && pdict->pbroker) { ! 273: enchant_broker_free_dict(pdict->pbroker->pbroker, pdict->pdict); ! 274: if (pdict->id) { ! 275: pdict->pbroker->dict[pdict->id-1]->next = NULL; ! 276: } ! 277: zend_list_delete(pdict->pbroker->rsrc_id); ! 278: } ! 279: ! 280: } ! 281: } ! 282: } ! 283: /* }}} */ ! 284: ! 285: /* {{{ PHP_MINIT_FUNCTION ! 286: */ ! 287: PHP_MINIT_FUNCTION(enchant) ! 288: { ! 289: le_enchant_broker = zend_register_list_destructors_ex(php_enchant_broker_free, NULL, "enchant_broker", module_number); ! 290: le_enchant_dict = zend_register_list_destructors_ex(php_enchant_dict_free, NULL, "enchant_dict", module_number); ! 291: REGISTER_LONG_CONSTANT("ENCHANT_MYSPELL", PHP_ENCHANT_MYSPELL, CONST_CS | CONST_PERSISTENT); ! 292: REGISTER_LONG_CONSTANT("ENCHANT_ISPELL", PHP_ENCHANT_ISPELL, CONST_CS | CONST_PERSISTENT); ! 293: return SUCCESS; ! 294: } ! 295: /* }}} */ ! 296: ! 297: /* {{{ PHP_MSHUTDOWN_FUNCTION ! 298: */ ! 299: PHP_MSHUTDOWN_FUNCTION(enchant) ! 300: { ! 301: return SUCCESS; ! 302: } ! 303: /* }}} */ ! 304: ! 305: static void __enumerate_providers_fn (const char * const name, ! 306: const char * const desc, ! 307: const char * const file, ! 308: void * ud) /* {{{ */ ! 309: { ! 310: php_info_print_table_row(3, name, desc, file); ! 311: } ! 312: /* }}} */ ! 313: ! 314: /* {{{ PHP_MINFO_FUNCTION ! 315: */ ! 316: PHP_MINFO_FUNCTION(enchant) ! 317: { ! 318: EnchantBroker *pbroker; ! 319: ! 320: pbroker = enchant_broker_init(); ! 321: php_info_print_table_start(); ! 322: php_info_print_table_header(2, "enchant support", "enabled"); ! 323: php_info_print_table_row(2, "Version", PHP_ENCHANT_VERSION); ! 324: #ifdef ENCHANT_VERSION_STRING ! 325: php_info_print_table_row(2, "Libenchant Version", ENCHANT_VERSION_STRING); ! 326: #elif defined(HAVE_ENCHANT_BROKER_SET_PARAM) ! 327: php_info_print_table_row(2, "Libenchant Version", "1.5.0 or later"); ! 328: #endif ! 329: php_info_print_table_row(2, "Revision", "$Revision: 321634 $"); ! 330: php_info_print_table_end(); ! 331: ! 332: php_info_print_table_start(); ! 333: enchant_broker_describe(pbroker, __enumerate_providers_fn, NULL); ! 334: php_info_print_table_end(); ! 335: enchant_broker_free(pbroker); ! 336: } ! 337: /* }}} */ ! 338: ! 339: #define PHP_ENCHANT_GET_BROKER \ ! 340: ZEND_FETCH_RESOURCE(pbroker, enchant_broker *, &broker, -1, "enchant_broker", le_enchant_broker); \ ! 341: if (!pbroker || !pbroker->pbroker) { \ ! 342: php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", "Resource broker invalid"); \ ! 343: RETURN_FALSE; \ ! 344: } ! 345: ! 346: #define PHP_ENCHANT_GET_DICT \ ! 347: ZEND_FETCH_RESOURCE(pdict, enchant_dict *, &dict, -1, "enchant_dict", le_enchant_dict); \ ! 348: if (!pdict || !pdict->pdict) { \ ! 349: php_error_docref(NULL TSRMLS_CC, E_WARNING, "%s", "Invalid dictionary resource."); \ ! 350: RETURN_FALSE; \ ! 351: } ! 352: ! 353: /* {{{ proto resource enchant_broker_init() ! 354: create a new broker object capable of requesting */ ! 355: PHP_FUNCTION(enchant_broker_init) ! 356: { ! 357: enchant_broker *broker; ! 358: EnchantBroker *pbroker; ! 359: ! 360: if (ZEND_NUM_ARGS()) { ! 361: ZEND_WRONG_PARAM_COUNT(); ! 362: } ! 363: ! 364: pbroker = enchant_broker_init(); ! 365: ! 366: if (pbroker) { ! 367: broker = (enchant_broker *) emalloc(sizeof(enchant_broker)); ! 368: broker->pbroker = pbroker; ! 369: broker->dict = NULL; ! 370: broker->dictcnt = 0; ! 371: broker->rsrc_id = ZEND_REGISTER_RESOURCE(return_value, broker, le_enchant_broker); ! 372: } else { ! 373: RETURN_FALSE; ! 374: } ! 375: } ! 376: /* }}} */ ! 377: ! 378: /* {{{ proto boolean enchant_broker_free(resource broker) ! 379: Destroys the broker object and its dictionnaries */ ! 380: PHP_FUNCTION(enchant_broker_free) ! 381: { ! 382: zval *broker; ! 383: enchant_broker *pbroker; ! 384: ! 385: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &broker) == FAILURE) { ! 386: RETURN_FALSE; ! 387: } ! 388: PHP_ENCHANT_GET_BROKER; ! 389: ! 390: zend_list_delete(Z_RESVAL_P(broker)); ! 391: RETURN_TRUE; ! 392: } ! 393: /* }}} */ ! 394: ! 395: /* {{{ proto string enchant_broker_get_error(resource broker) ! 396: Returns the last error of the broker */ ! 397: PHP_FUNCTION(enchant_broker_get_error) ! 398: { ! 399: zval *broker; ! 400: enchant_broker *pbroker; ! 401: char *msg; ! 402: ! 403: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &broker) == FAILURE) { ! 404: RETURN_FALSE; ! 405: } ! 406: ! 407: PHP_ENCHANT_GET_BROKER; ! 408: ! 409: msg = enchant_broker_get_error(pbroker->pbroker); ! 410: if (msg) { ! 411: RETURN_STRING((char *)msg, 1); ! 412: } ! 413: RETURN_FALSE; ! 414: } ! 415: /* }}} */ ! 416: ! 417: #if HAVE_ENCHANT_BROKER_SET_PARAM ! 418: /* {{{ proto bool enchant_broker_set_dict_path(resource broker, int dict_type, string value) ! 419: Set the directory path for a given backend, works with ispell and myspell */ ! 420: PHP_FUNCTION(enchant_broker_set_dict_path) ! 421: { ! 422: zval *broker; ! 423: enchant_broker *pbroker; ! 424: long dict_type; ! 425: char *value; ! 426: int value_len; ! 427: ! 428: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rls", &broker, &dict_type, &value, &value_len) == FAILURE) { ! 429: RETURN_FALSE; ! 430: } ! 431: ! 432: if (!value_len) { ! 433: RETURN_FALSE; ! 434: } ! 435: ! 436: PHP_ENCHANT_GET_BROKER; ! 437: ! 438: switch (dict_type) { ! 439: case PHP_ENCHANT_MYSPELL: ! 440: PHP_ENCHANT_GET_BROKER; ! 441: enchant_broker_set_param(pbroker->pbroker, "enchant.myspell.dictionary.path", (const char *)value); ! 442: RETURN_TRUE; ! 443: break; ! 444: ! 445: case PHP_ENCHANT_ISPELL: ! 446: PHP_ENCHANT_GET_BROKER; ! 447: enchant_broker_set_param(pbroker->pbroker, "enchant.ispell.dictionary.path", (const char *)value); ! 448: RETURN_TRUE; ! 449: break; ! 450: ! 451: default: ! 452: RETURN_FALSE; ! 453: } ! 454: } ! 455: /* }}} */ ! 456: ! 457: ! 458: /* {{{ proto string enchant_broker_get_dict_path(resource broker, int dict_type) ! 459: Get the directory path for a given backend, works with ispell and myspell */ ! 460: PHP_FUNCTION(enchant_broker_get_dict_path) ! 461: { ! 462: zval *broker; ! 463: enchant_broker *pbroker; ! 464: long dict_type; ! 465: char *value; ! 466: ! 467: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rl", &broker, &dict_type) == FAILURE) { ! 468: RETURN_FALSE; ! 469: } ! 470: ! 471: PHP_ENCHANT_GET_BROKER; ! 472: ! 473: switch (dict_type) { ! 474: case PHP_ENCHANT_MYSPELL: ! 475: PHP_ENCHANT_GET_BROKER; ! 476: value = enchant_broker_get_param(pbroker->pbroker, "enchant.myspell.dictionary.path"); ! 477: break; ! 478: ! 479: case PHP_ENCHANT_ISPELL: ! 480: PHP_ENCHANT_GET_BROKER; ! 481: value = enchant_broker_get_param(pbroker->pbroker, "enchant.ispell.dictionary.path"); ! 482: break; ! 483: ! 484: default: ! 485: RETURN_FALSE; ! 486: } ! 487: ! 488: RETURN_STRING(value, 1); ! 489: } ! 490: /* }}} */ ! 491: #else ! 492: /* {{{ proto bool enchant_broker_set_dict_path(resource broker, int dict_type, string value) ! 493: Set the directory path for a given backend, works with ispell and myspell */ ! 494: PHP_FUNCTION(enchant_broker_set_dict_path) ! 495: { ! 496: RETURN_FALSE; ! 497: } ! 498: /* }}} */ ! 499: ! 500: ! 501: /* {{{ proto string enchant_broker_get_dict_path(resource broker, int dict_type) ! 502: Get the directory path for a given backend, works with ispell and myspell */ ! 503: PHP_FUNCTION(enchant_broker_get_dict_path) ! 504: { ! 505: RETURN_FALSE; ! 506: } ! 507: /* }}} */ ! 508: #endif ! 509: ! 510: /* {{{ proto string enchant_broker_list_dicts(resource broker) ! 511: Lists the dictionaries available for the given broker */ ! 512: PHP_FUNCTION(enchant_broker_list_dicts) ! 513: { ! 514: zval *broker; ! 515: enchant_broker *pbroker; ! 516: ! 517: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &broker) == FAILURE) { ! 518: RETURN_FALSE; ! 519: } ! 520: ! 521: PHP_ENCHANT_GET_BROKER; ! 522: ! 523: enchant_broker_list_dicts(pbroker->pbroker, php_enchant_list_dicts_fn, (void *)return_value); ! 524: } ! 525: /* }}} */ ! 526: ! 527: /* {{{ proto resource enchant_broker_request_dict(resource broker, string tag) ! 528: create a new dictionary using tag, the non-empty language tag you wish to request ! 529: a dictionary for ("en_US", "de_DE", ...) */ ! 530: PHP_FUNCTION(enchant_broker_request_dict) ! 531: { ! 532: zval *broker; ! 533: enchant_broker *pbroker; ! 534: enchant_dict *dict; ! 535: EnchantDict *d; ! 536: char *tag; ! 537: int taglen; ! 538: int pos; ! 539: ! 540: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &broker, &tag, &taglen) == FAILURE) { ! 541: RETURN_FALSE; ! 542: } ! 543: ! 544: PHP_ENCHANT_GET_BROKER; ! 545: ! 546: d = enchant_broker_request_dict(pbroker->pbroker, (const char *)tag); ! 547: if (d) { ! 548: if (pbroker->dictcnt) { ! 549: pbroker->dict = (enchant_dict **)erealloc(pbroker->dict, sizeof(enchant_dict *) * pbroker->dictcnt); ! 550: pos = pbroker->dictcnt++; ! 551: } else { ! 552: pbroker->dict = (enchant_dict **)emalloc(sizeof(enchant_dict *)); ! 553: pos = 0; ! 554: pbroker->dictcnt++; ! 555: } ! 556: ! 557: dict = pbroker->dict[pos] = (enchant_dict *)emalloc(sizeof(enchant_dict)); ! 558: dict->id = pos; ! 559: dict->pbroker = pbroker; ! 560: dict->pdict = d; ! 561: dict->prev = pos ? pbroker->dict[pos-1] : NULL; ! 562: dict->next = NULL; ! 563: pbroker->dict[pos] = dict; ! 564: ! 565: if (pos) { ! 566: pbroker->dict[pos-1]->next = dict; ! 567: } ! 568: ! 569: dict->rsrc_id = ZEND_REGISTER_RESOURCE(return_value, dict, le_enchant_dict); ! 570: zend_list_addref(pbroker->rsrc_id); ! 571: } else { ! 572: RETURN_FALSE; ! 573: } ! 574: } ! 575: /* }}} */ ! 576: ! 577: /* {{{ proto resource enchant_broker_request_pwl_dict(resource broker, string filename) ! 578: creates a dictionary using a PWL file. A PWL file is personal word file one word per line. It must exist before the call.*/ ! 579: PHP_FUNCTION(enchant_broker_request_pwl_dict) ! 580: { ! 581: zval *broker; ! 582: enchant_broker *pbroker; ! 583: enchant_dict *dict; ! 584: EnchantDict *d; ! 585: char *pwl; ! 586: int pwllen; ! 587: int pos; ! 588: ! 589: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &broker, &pwl, &pwllen) == FAILURE) { ! 590: RETURN_FALSE; ! 591: } ! 592: ! 593: if (strlen(pwl) != pwllen) { ! 594: RETURN_FALSE; ! 595: } ! 596: ! 597: #if PHP_API_VERSION < 20100412 ! 598: if ((PG(safe_mode) && (!php_checkuid(pwl, NULL, CHECKUID_CHECK_FILE_AND_DIR))) || php_check_open_basedir(pwl TSRMLS_CC)) { ! 599: #else ! 600: if (php_check_open_basedir(pwl TSRMLS_CC)) { ! 601: #endif ! 602: RETURN_FALSE; ! 603: } ! 604: ! 605: PHP_ENCHANT_GET_BROKER; ! 606: ! 607: d = enchant_broker_request_pwl_dict(pbroker->pbroker, (const char *)pwl); ! 608: if (d) { ! 609: if (pbroker->dictcnt) { ! 610: pos = pbroker->dictcnt++; ! 611: pbroker->dict = (enchant_dict **)erealloc(pbroker->dict, sizeof(enchant_dict *) * pbroker->dictcnt); ! 612: } else { ! 613: pbroker->dict = (enchant_dict **)emalloc(sizeof(enchant_dict *)); ! 614: pos = 0; ! 615: pbroker->dictcnt++; ! 616: } ! 617: dict = pbroker->dict[pos] = (enchant_dict *)emalloc(sizeof(enchant_dict)); ! 618: dict->id = pos; ! 619: dict->pbroker = pbroker; ! 620: dict->pdict = d; ! 621: dict->prev = pos?pbroker->dict[pos-1]:NULL; ! 622: dict->next = NULL; ! 623: pbroker->dict[pos] = dict; ! 624: if (pos) { ! 625: pbroker->dict[pos-1]->next = dict; ! 626: } ! 627: dict->rsrc_id = ZEND_REGISTER_RESOURCE(return_value, dict, le_enchant_dict); ! 628: } else { ! 629: RETURN_FALSE; ! 630: } ! 631: } ! 632: /* }}} */ ! 633: ! 634: /* {{{ proto resource enchant_broker_free_dict(resource dict) ! 635: Free the dictionary resource */ ! 636: PHP_FUNCTION(enchant_broker_free_dict) ! 637: { ! 638: zval *dict; ! 639: enchant_dict *pdict; ! 640: ! 641: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &dict) == FAILURE) { ! 642: RETURN_FALSE; ! 643: } ! 644: ! 645: PHP_ENCHANT_GET_DICT; ! 646: ! 647: zend_list_delete(Z_RESVAL_P(dict)); ! 648: RETURN_TRUE; ! 649: } ! 650: /* }}} */ ! 651: ! 652: /* {{{ proto bool enchant_broker_dict_exists(resource broker, string tag) ! 653: Wether a dictionary exists or not. Using non-empty tag */ ! 654: PHP_FUNCTION(enchant_broker_dict_exists) ! 655: { ! 656: zval *broker; ! 657: char *tag; ! 658: int taglen; ! 659: enchant_broker * pbroker; ! 660: ! 661: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &broker, &tag, &taglen) == FAILURE) { ! 662: RETURN_FALSE; ! 663: } ! 664: ! 665: PHP_ENCHANT_GET_BROKER; ! 666: ! 667: RETURN_BOOL(enchant_broker_dict_exists(pbroker->pbroker, tag)); ! 668: } ! 669: /* }}} */ ! 670: ! 671: /* {{{ proto bool enchant_broker_set_ordering(resource broker, string tag, string ordering) ! 672: Declares a preference of dictionaries to use for the language ! 673: described/referred to by 'tag'. The ordering is a comma delimited ! 674: list of provider names. As a special exception, the "*" tag can ! 675: be used as a language tag to declare a default ordering for any ! 676: language that does not explictly declare an ordering. */ ! 677: ! 678: PHP_FUNCTION(enchant_broker_set_ordering) ! 679: { ! 680: zval *broker; ! 681: char *pordering; ! 682: int porderinglen; ! 683: char *ptag; ! 684: int ptaglen; ! 685: enchant_broker * pbroker; ! 686: ! 687: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &broker, &ptag, &ptaglen, &pordering, &porderinglen) == FAILURE) { ! 688: RETURN_FALSE; ! 689: } ! 690: ! 691: PHP_ENCHANT_GET_BROKER; ! 692: ! 693: enchant_broker_set_ordering(pbroker->pbroker, ptag, pordering); ! 694: RETURN_TRUE; ! 695: } ! 696: /* }}} */ ! 697: ! 698: /* {{{ proto array enchant_broker_describe(resource broker) ! 699: Enumerates the Enchant providers and tells you some rudimentary information about them. The same info is provided through phpinfo() */ ! 700: PHP_FUNCTION(enchant_broker_describe) ! 701: { ! 702: EnchantBrokerDescribeFn describetozval = enumerate_providers_fn; ! 703: zval *broker; ! 704: enchant_broker * pbroker; ! 705: ! 706: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &broker) == FAILURE) { ! 707: RETURN_FALSE; ! 708: } ! 709: ! 710: PHP_ENCHANT_GET_BROKER; ! 711: ! 712: enchant_broker_describe(pbroker->pbroker, describetozval, (void *)return_value); ! 713: } ! 714: /* }}} */ ! 715: ! 716: /* {{{ proto bool enchant_dict_quick_check(resource dict, string word [, array &suggestions]) ! 717: If the word is correctly spelled return true, otherwise return false, if suggestions variable ! 718: is provided, fill it with spelling alternatives. */ ! 719: PHP_FUNCTION(enchant_dict_quick_check) ! 720: { ! 721: zval *dict, *sugg = NULL; ! 722: char *word; ! 723: int wordlen; ! 724: enchant_dict *pdict; ! 725: ! 726: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs|z/", &dict, &word, &wordlen, &sugg) == FAILURE) { ! 727: RETURN_FALSE; ! 728: } ! 729: ! 730: if (sugg) { ! 731: zval_dtor(sugg); ! 732: } ! 733: ! 734: PHP_ENCHANT_GET_DICT; ! 735: ! 736: if (enchant_dict_check(pdict->pdict, word, wordlen) > 0) { ! 737: int n_sugg; ! 738: size_t n_sugg_st; ! 739: char **suggs; ! 740: ! 741: if (!sugg && ZEND_NUM_ARGS() == 2) { ! 742: RETURN_FALSE; ! 743: } ! 744: ! 745: array_init(sugg); ! 746: ! 747: suggs = enchant_dict_suggest(pdict->pdict, word, wordlen, &n_sugg_st); ! 748: memcpy(&n_sugg, &n_sugg_st, sizeof(n_sugg)); ! 749: if (suggs && n_sugg) { ! 750: int i; ! 751: for (i = 0; i < n_sugg; i++) { ! 752: add_next_index_string(sugg, suggs[i], 1); ! 753: } ! 754: enchant_dict_free_suggestions(pdict->pdict, suggs); ! 755: } ! 756: ! 757: ! 758: RETURN_FALSE; ! 759: } ! 760: RETURN_TRUE; ! 761: } ! 762: /* }}} */ ! 763: ! 764: /* {{{ proto bool enchant_dict_check(resource dict, string word) ! 765: If the word is correctly spelled return true, otherwise return false */ ! 766: PHP_FUNCTION(enchant_dict_check) ! 767: { ! 768: zval *dict; ! 769: char *word; ! 770: int wordlen; ! 771: enchant_dict *pdict; ! 772: ! 773: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &dict, &word, &wordlen) == FAILURE) { ! 774: RETURN_FALSE; ! 775: } ! 776: ! 777: PHP_ENCHANT_GET_DICT; ! 778: ! 779: RETURN_BOOL(!enchant_dict_check(pdict->pdict, word, wordlen)); ! 780: } ! 781: /* }}} */ ! 782: ! 783: /* {{{ proto array enchant_dict_suggest(resource dict, string word) ! 784: Will return a list of values if any of those pre-conditions are not met.*/ ! 785: PHP_FUNCTION(enchant_dict_suggest) ! 786: { ! 787: zval *dict; ! 788: char *word; ! 789: int wordlen; ! 790: char **suggs; ! 791: enchant_dict *pdict; ! 792: int n_sugg; ! 793: size_t n_sugg_st; ! 794: ! 795: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &dict, &word, &wordlen) == FAILURE) { ! 796: RETURN_FALSE; ! 797: } ! 798: ! 799: PHP_ENCHANT_GET_DICT; ! 800: ! 801: suggs = enchant_dict_suggest(pdict->pdict, word, wordlen, &n_sugg_st); ! 802: memcpy(&n_sugg, &n_sugg_st, sizeof(n_sugg)); ! 803: if (suggs && n_sugg) { ! 804: int i; ! 805: ! 806: array_init(return_value); ! 807: for (i = 0; i < n_sugg; i++) { ! 808: add_next_index_string(return_value, suggs[i], 1); ! 809: } ! 810: ! 811: enchant_dict_free_suggestions(pdict->pdict, suggs); ! 812: } ! 813: } ! 814: /* }}} */ ! 815: ! 816: /* {{{ proto void enchant_dict_add_to_personal(resource dict, string word) ! 817: add 'word' to personal word list */ ! 818: PHP_FUNCTION(enchant_dict_add_to_personal) ! 819: { ! 820: zval *dict; ! 821: char *word; ! 822: int wordlen; ! 823: enchant_dict *pdict; ! 824: ! 825: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &dict, &word, &wordlen) == FAILURE) { ! 826: RETURN_FALSE; ! 827: } ! 828: ! 829: PHP_ENCHANT_GET_DICT; ! 830: ! 831: enchant_dict_add_to_personal(pdict->pdict, word, wordlen); ! 832: } ! 833: /* }}} */ ! 834: ! 835: /* {{{ proto void enchant_dict_add_to_session(resource dict, string word) ! 836: add 'word' to this spell-checking session */ ! 837: PHP_FUNCTION(enchant_dict_add_to_session) ! 838: { ! 839: zval *dict; ! 840: char *word; ! 841: int wordlen; ! 842: enchant_dict *pdict; ! 843: ! 844: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &dict, &word, &wordlen) == FAILURE) { ! 845: RETURN_FALSE; ! 846: } ! 847: ! 848: PHP_ENCHANT_GET_DICT; ! 849: ! 850: enchant_dict_add_to_session(pdict->pdict, word, wordlen); ! 851: } ! 852: /* }}} */ ! 853: ! 854: /* {{{ proto bool enchant_dict_is_in_session(resource dict, string word) ! 855: whether or not 'word' exists in this spelling-session */ ! 856: PHP_FUNCTION(enchant_dict_is_in_session) ! 857: { ! 858: zval *dict; ! 859: char *word; ! 860: int wordlen; ! 861: enchant_dict *pdict; ! 862: ! 863: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rs", &dict, &word, &wordlen) == FAILURE) { ! 864: RETURN_FALSE; ! 865: } ! 866: ! 867: PHP_ENCHANT_GET_DICT; ! 868: ! 869: RETURN_BOOL(enchant_dict_is_in_session(pdict->pdict, word, wordlen)); ! 870: } ! 871: /* }}} */ ! 872: ! 873: /* {{{ proto void enchant_dict_store_replacement(resource dict, string mis, string cor) ! 874: add a correction for 'mis' using 'cor'. ! 875: Notes that you replaced @mis with @cor, so it's possibly more likely ! 876: that future occurrences of @mis will be replaced with @cor. So it might ! 877: bump @cor up in the suggestion list.*/ ! 878: PHP_FUNCTION(enchant_dict_store_replacement) ! 879: { ! 880: zval *dict; ! 881: char *mis, *cor; ! 882: int mislen, corlen; ! 883: ! 884: enchant_dict *pdict; ! 885: ! 886: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rss", &dict, &mis, &mislen, &cor, &corlen) == FAILURE) { ! 887: RETURN_FALSE; ! 888: } ! 889: ! 890: PHP_ENCHANT_GET_DICT; ! 891: ! 892: enchant_dict_store_replacement(pdict->pdict, mis, mislen, cor, corlen); ! 893: } ! 894: /* }}} */ ! 895: ! 896: /* {{{ proto string enchant_dict_get_error(resource dict) ! 897: Returns the last error of the current spelling-session */ ! 898: PHP_FUNCTION(enchant_dict_get_error) ! 899: { ! 900: zval *dict; ! 901: enchant_dict *pdict; ! 902: char *msg; ! 903: ! 904: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &dict) == FAILURE) { ! 905: RETURN_FALSE; ! 906: } ! 907: ! 908: PHP_ENCHANT_GET_DICT; ! 909: ! 910: msg = enchant_dict_get_error(pdict->pdict); ! 911: if (msg) { ! 912: RETURN_STRING((char *)msg, 1); ! 913: } ! 914: ! 915: RETURN_FALSE; ! 916: } ! 917: /* }}} */ ! 918: ! 919: /* {{{ proto array enchant_dict_describe(resource dict) ! 920: Describes an individual dictionary 'dict' */ ! 921: PHP_FUNCTION(enchant_dict_describe) ! 922: { ! 923: zval *dict; ! 924: enchant_dict *pdict; ! 925: ! 926: if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "r", &dict) == FAILURE) { ! 927: RETURN_FALSE; ! 928: } ! 929: ! 930: PHP_ENCHANT_GET_DICT; ! 931: ! 932: enchant_dict_describe(pdict->pdict, describe_dict_fn, (void *)return_value); ! 933: } ! 934: /* }}} */ ! 935: ! 936: /* ! 937: * Local variables: ! 938: * tab-width: 4 ! 939: * c-basic-offset: 4 ! 940: * End: ! 941: * vim600: noet sw=4 ts=4 fdm=marker ! 942: * vim<600: noet sw=4 ts=4 ! 943: */