⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pspell.c

📁 php-4.4.7学习linux时下载的源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/*   +----------------------------------------------------------------------+   | 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 + -