📄 pspell.c
字号:
/* +----------------------------------------------------------------------+ | PHP Version 4 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2007 The PHP Group | +----------------------------------------------------------------------+ | This source file is subject to version 3.01 of the PHP license, | | that is bundled with this package in the file LICENSE, and is | | available through the world-wide-web at the following url: | | http://www.php.net/license/3_01.txt | | If you did not receive a copy of the PHP license and are unable to | | obtain it through the world-wide-web, please send a note to | | license@php.net so we can mail you a copy immediately. | +----------------------------------------------------------------------+ | Author: Vlad Krupin <phpdevel@echospace.com> | +----------------------------------------------------------------------+*//* $Id: pspell.c,v 1.28.8.5.4.5 2007/01/01 09:46:46 sebastian Exp $ */#define IS_EXT_MODULE#ifdef HAVE_CONFIG_H#include "config.h"#endif#include "php.h"#include <stdlib.h>#include <ctype.h>#include <stdio.h>#if HAVE_PSPELL/* this will enforce compatibility in .12 version (broken after .11.2) */#define USE_ORIGINAL_MANAGER_FUNCS#include "php_pspell.h"#include <pspell.h>#include "ext/standard/info.h"#define PSPELL_FAST 1L#define PSPELL_NORMAL 2L#define PSPELL_BAD_SPELLERS 3L#define PSPELL_SPEED_MASK_INTERNAL 3L#define PSPELL_RUN_TOGETHER 8L/* Largest ignored word can be 999 characters (this seems sane enough), * and it takes 3 bytes to represent that (see pspell_config_ignore) */#define PSPELL_LARGEST_WORD 3/* {{{ pspell_functions[] */function_entry pspell_functions[] = { PHP_FE(pspell_new, NULL) PHP_FE(pspell_new_personal, NULL) PHP_FE(pspell_new_config, NULL) PHP_FE(pspell_check, NULL) PHP_FE(pspell_suggest, NULL) PHP_FE(pspell_store_replacement, NULL) PHP_FE(pspell_add_to_personal, NULL) PHP_FE(pspell_add_to_session, NULL) PHP_FE(pspell_clear_session, NULL) PHP_FE(pspell_save_wordlist, NULL) PHP_FE(pspell_config_create, NULL) PHP_FE(pspell_config_runtogether, NULL) PHP_FE(pspell_config_mode, NULL) PHP_FE(pspell_config_ignore, NULL) PHP_FE(pspell_config_personal, NULL) PHP_FE(pspell_config_repl, NULL) PHP_FE(pspell_config_save_repl, NULL) {NULL, NULL, NULL} };/* }}} */static int le_pspell, le_pspell_config;zend_module_entry pspell_module_entry = { STANDARD_MODULE_HEADER, "pspell", pspell_functions, PHP_MINIT(pspell), NULL, NULL, NULL, PHP_MINFO(pspell), NO_VERSION_YET, STANDARD_MODULE_PROPERTIES};#ifdef COMPILE_DL_PSPELLZEND_GET_MODULE(pspell)#endifstatic void php_pspell_close(zend_rsrc_list_entry *rsrc TSRMLS_DC){ PspellManager *manager = (PspellManager *)rsrc->ptr; delete_pspell_manager(manager);}static void php_pspell_close_config(zend_rsrc_list_entry *rsrc TSRMLS_DC){ PspellConfig *config = (PspellConfig *)rsrc->ptr; delete_pspell_config(config);}#define PSPELL_FETCH_CONFIG \ convert_to_long_ex(conf); \ config = (PspellConfig *) zend_list_find(Z_LVAL_PP(conf), &type); \ if (config == NULL || type != le_pspell_config) { \ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%ld is not a PSPELL config index", Z_LVAL_PP(conf)); \ RETURN_FALSE; \ } \#define PSPELL_FETCH_MANAGER \ convert_to_long_ex(scin); \ manager = (PspellManager *) zend_list_find(Z_LVAL_PP(scin), &type); \ if (!manager || type != le_pspell) { \ php_error_docref(NULL TSRMLS_CC, E_WARNING, "%ld is not a PSPELL result index", Z_LVAL_PP(scin)); \ RETURN_FALSE; \ } \/* {{{ PHP_MINIT_FUNCTION */PHP_MINIT_FUNCTION(pspell){ REGISTER_LONG_CONSTANT("PSPELL_FAST", PSPELL_FAST, CONST_PERSISTENT | CONST_CS); REGISTER_LONG_CONSTANT("PSPELL_NORMAL", PSPELL_NORMAL, CONST_PERSISTENT | CONST_CS); REGISTER_LONG_CONSTANT("PSPELL_BAD_SPELLERS", PSPELL_BAD_SPELLERS, CONST_PERSISTENT | CONST_CS); REGISTER_LONG_CONSTANT("PSPELL_RUN_TOGETHER", PSPELL_RUN_TOGETHER, CONST_PERSISTENT | CONST_CS); le_pspell = zend_register_list_destructors_ex(php_pspell_close, NULL, "pspell", module_number); le_pspell_config = zend_register_list_destructors_ex(php_pspell_close_config, NULL, "pspell config", module_number); return SUCCESS;}/* }}} *//* {{{ proto int pspell_new(string language [, string spelling [, string jargon [, string encoding [, int mode]]]]) Load a dictionary */PHP_FUNCTION(pspell_new){ zval **language,**spelling,**jargon,**encoding,**pmode; long mode = 0L, speed = 0L; int argc; int ind;#ifdef PHP_WIN32 TCHAR aspell_dir[200]; TCHAR data_dir[220]; TCHAR dict_dir[220]; HKEY hkey; DWORD dwType,dwLen;#endif PspellCanHaveError *ret; PspellManager *manager; PspellConfig *config; argc = ZEND_NUM_ARGS(); if (argc < 1 || argc > 5 || zend_get_parameters_ex(argc,&language,&spelling,&jargon,&encoding,&pmode) == FAILURE) { WRONG_PARAM_COUNT; } config = new_pspell_config();#ifdef PHP_WIN32 /* If aspell was installed using installer, we should have a key * pointing to the location of the dictionaries */ if(0 == RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\Aspell", &hkey)) { RegQueryValueEx(hkey, "", NULL, &dwType, (LPBYTE)&aspell_dir, &dwLen); RegCloseKey(hkey); strcpy(data_dir, aspell_dir); strcat(data_dir, "\\data"); strcpy(dict_dir, aspell_dir); strcat(dict_dir, "\\dict"); pspell_config_replace(config, "data-dir", data_dir); pspell_config_replace(config, "dict-dir", dict_dir); }#endif convert_to_string_ex(language); pspell_config_replace(config, "language-tag", Z_STRVAL_PP(language)); if(argc > 1){ convert_to_string_ex(spelling); if(Z_STRLEN_PP(spelling) > 0){ pspell_config_replace(config, "spelling", Z_STRVAL_PP(spelling)); } } if(argc > 2){ convert_to_string_ex(jargon); if(Z_STRLEN_PP(jargon) > 0){ pspell_config_replace(config, "jargon", Z_STRVAL_PP(jargon)); } } if(argc > 3){ convert_to_string_ex(encoding); if(Z_STRLEN_PP(encoding) > 0){ pspell_config_replace(config, "encoding", Z_STRVAL_PP(encoding)); } } if(argc > 4){ convert_to_long_ex(pmode); mode = Z_LVAL_PP(pmode); speed = mode & PSPELL_SPEED_MASK_INTERNAL; /* First check what mode we want (how many suggestions) */ if(speed == PSPELL_FAST){ pspell_config_replace(config, "sug-mode", "fast"); }else if(speed == PSPELL_NORMAL){ pspell_config_replace(config, "sug-mode", "normal"); }else if(speed == PSPELL_BAD_SPELLERS){ pspell_config_replace(config, "sug-mode", "bad-spellers"); } /* Then we see if run-together words should be treated as valid components */ if(mode & PSPELL_RUN_TOGETHER){ pspell_config_replace(config, "run-together", "true"); } } ret = new_pspell_manager(config); delete_pspell_config(config); if(pspell_error_number(ret) != 0){ php_error(E_WARNING, "PSPELL couldn't open the dictionary. reason: %s ", pspell_error_message(ret)); RETURN_FALSE; } manager = to_pspell_manager(ret); ind = zend_list_insert(manager, le_pspell); RETURN_LONG(ind);}/* }}} *//* {{{ proto int pspell_new_personal(string personal, string language [, string spelling [, string jargon [, string encoding [, int mode]]]]) Load a dictionary with a personal wordlist*/PHP_FUNCTION(pspell_new_personal){ zval **personal, **language,**spelling,**jargon,**encoding,**pmode; long mode = 0L, speed = 0L; int argc; int ind;#ifdef PHP_WIN32 TCHAR aspell_dir[200]; TCHAR data_dir[220]; TCHAR dict_dir[220]; HKEY hkey; DWORD dwType,dwLen;#endif PspellCanHaveError *ret; PspellManager *manager; PspellConfig *config; argc = ZEND_NUM_ARGS(); if (argc < 2 || argc > 6 || zend_get_parameters_ex(argc,&personal,&language,&spelling,&jargon,&encoding,&pmode) == FAILURE) { WRONG_PARAM_COUNT; } config = new_pspell_config();#ifdef PHP_WIN32 /* If aspell was installed using installer, we should have a key * pointing to the location of the dictionaries */ if(0 == RegOpenKey(HKEY_LOCAL_MACHINE, "Software\\Aspell", &hkey)) { RegQueryValueEx(hkey, "", NULL, &dwType, (LPBYTE)&aspell_dir, &dwLen); RegCloseKey(hkey); strcpy(data_dir, aspell_dir); strcat(data_dir, "\\data"); strcpy(dict_dir, aspell_dir); strcat(dict_dir, "\\dict"); pspell_config_replace(config, "data-dir", data_dir); pspell_config_replace(config, "dict-dir", dict_dir); }#endif convert_to_string_ex(personal); if (PG(safe_mode) && (!php_checkuid(Z_STRVAL_PP(personal), NULL, CHECKUID_CHECK_FILE_AND_DIR))) { RETURN_FALSE; } if (php_check_open_basedir(Z_STRVAL_PP(personal) TSRMLS_CC)) { RETURN_FALSE; } pspell_config_replace(config, "personal", Z_STRVAL_PP(personal)); pspell_config_replace(config, "save-repl", "false"); convert_to_string_ex(language); pspell_config_replace(config, "language-tag", Z_STRVAL_PP(language)); if(argc > 2){ convert_to_string_ex(spelling); if(Z_STRLEN_PP(spelling) > 0){ pspell_config_replace(config, "spelling", Z_STRVAL_PP(spelling)); } } if(argc > 3){ convert_to_string_ex(jargon); if(Z_STRLEN_PP(jargon) > 0){ pspell_config_replace(config, "jargon", Z_STRVAL_PP(jargon)); } } if(argc > 4){ convert_to_string_ex(encoding); if(Z_STRLEN_PP(encoding) > 0){ pspell_config_replace(config, "encoding", Z_STRVAL_PP(encoding)); } } if(argc > 5){ convert_to_long_ex(pmode); mode = Z_LVAL_PP(pmode); speed = mode & PSPELL_SPEED_MASK_INTERNAL; /* First check what mode we want (how many suggestions) */ if(speed == PSPELL_FAST){ pspell_config_replace(config, "sug-mode", "fast"); }else if(speed == PSPELL_NORMAL){ pspell_config_replace(config, "sug-mode", "normal"); }else if(speed == PSPELL_BAD_SPELLERS){ pspell_config_replace(config, "sug-mode", "bad-spellers"); } /* Then we see if run-together words should be treated as valid components */ if(mode & PSPELL_RUN_TOGETHER){ pspell_config_replace(config, "run-together", "true"); } } ret = new_pspell_manager(config); delete_pspell_config(config); if(pspell_error_number(ret) != 0){ php_error(E_WARNING, "PSPELL couldn't open the dictionary. reason: %s ", pspell_error_message(ret)); RETURN_FALSE; } manager = to_pspell_manager(ret); ind = zend_list_insert(manager, le_pspell); RETURN_LONG(ind);}/* }}} *//* {{{ proto int pspell_new_config(int config) Load a dictionary based on the given config */PHP_FUNCTION(pspell_new_config){ int type; zval **conf; int argc; int ind; PspellCanHaveError *ret; PspellManager *manager; PspellConfig *config; argc = ZEND_NUM_ARGS(); if (argc != 1 || zend_get_parameters_ex(argc,&conf) == FAILURE) { WRONG_PARAM_COUNT; } PSPELL_FETCH_CONFIG; ret = new_pspell_manager(config); if(pspell_error_number(ret) != 0){ php_error(E_WARNING, "PSPELL couldn't open the dictionary. reason: %s ", pspell_error_message(ret)); RETURN_FALSE; } manager = to_pspell_manager(ret); ind = zend_list_insert(manager, le_pspell); RETURN_LONG(ind);}/* }}} *//* {{{ proto int pspell_check(int pspell, string word) Returns true if word is valid */PHP_FUNCTION(pspell_check){ int type; zval **scin,**word; PspellManager *manager; int argc; argc = ZEND_NUM_ARGS(); if (argc != 2 || zend_get_parameters_ex(argc, &scin,&word) == FAILURE) { WRONG_PARAM_COUNT; } convert_to_string_ex(word); PSPELL_FETCH_MANAGER; if(pspell_manager_check(manager, Z_STRVAL_PP(word))){ RETURN_TRUE; }else{ RETURN_FALSE; }}/* }}} *//* {{{ proto array pspell_suggest(int pspell, string word) Returns array of suggestions */PHP_FUNCTION(pspell_suggest){ zval **scin, **word; int argc; PspellManager *manager; int type; const PspellWordList *wl; const char *sug; argc = ZEND_NUM_ARGS();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -