diff -riwBu -Xex aspell-setter-sep06/common/config.cpp aspell-setter-sep06-modified/common/config.cpp --- aspell-setter-sep06/common/config.cpp 2005-12-12 17:41:06.000000000 +0100 +++ aspell-setter-sep06-modified/common/config.cpp 2007-02-16 22:40:26.947401600 +0100 @@ -78,6 +78,10 @@ namespace aspell { +#ifdef WIN32PORT + String GetWindowsDir(String registry_name, String default_directory); +#endif + const char * const keyinfo_type_name[4] = { N_("string"), N_("integer"), N_("boolean"), N_("list") }; @@ -642,20 +646,19 @@ } else if (strcmp(i, "home-dir") == 0) { - //get the personal folder (e.g. "c:\My Documents") - char * dir = new char[MAX_PATH]; - LPITEMIDLIST items = 0; - HRESULT hand = SHGetSpecialFolderLocation(0, CSIDL_PERSONAL, &items); - if ((NOERROR == hand) && items) { - if (SHGetPathFromIDList(items, dir)) { - for (char *ptr = dir; *ptr; ++ptr) - if ('\\' == *ptr) - *ptr = '/'; - final_str = dir; - } - CoTaskMemFree(items); - } - delete [] dir; + final_str = GetWindowsDir("Base Path", ""); + + } else if (strcmp(i, "dict-dir") == 0) { + + final_str = GetWindowsDir("Dictionary Path", "Dictionaries"); + + } else if (strcmp(i, "data-dir") == 0) { + + final_str = GetWindowsDir("Data Path", "Data"); + + } else if (strcmp(i, "personal-dir") == 0) { + + final_str = GetWindowsDir("Personal Path", "Personal"); } #endif @@ -1394,20 +1397,6 @@ return no_err; } -#if defined(WIN32_USE_PERSONAL_DIR) -# define HOME_DIR "!home-dir" -# define PERSONAL ".pws" -# define REPL ".prepl" -#elif defined(ENABLE_WIN32_RELOCATABLE) -# define HOME_DIR "" -# define PERSONAL ".pws" -# define REPL ".prepl" -#else -# define HOME_DIR "<$HOME|./>" -# define PERSONAL ".aspell..pws" -# define REPL ".aspell..prepl" -#endif - static const KeyInfo config_keys[] = { // the description should be under 50 chars {"actual-dict-dir", KeyInfoString, "", 0} @@ -1484,12 +1473,12 @@ , {"per-conf-path", KeyInfoString, "", 0} , {"personal", KeyInfoString, PERSONAL, N_("personal dictionary file name")} - , {"personal-path", KeyInfoString, "", 0} + , {"personal-path", KeyInfoString, "", 0} , {"prefix", KeyInfoString, PREFIX, N_("prefix directory")} , {"repl", KeyInfoString, REPL, N_("replacements list file name") } - , {"repl-path", KeyInfoString, "", 0} + , {"repl-path", KeyInfoString, "", 0} , {"run-together", KeyInfoBool, "false", N_("consider run-together words legal"), KEYINFO_MAY_CHANGE} , {"run-together-limit", KeyInfoInt, "2", @@ -1524,12 +1513,6 @@ N_("search path for word list information files"), KEYINFO_HIDDEN} , {"warn", KeyInfoBool, "true", N_("enable warnings")} -#ifdef WIN32PORT - , {"dict-subdir", KeyInfoString, "dicts", - N_("sub directory for dictionaries")} - , {"data-subdir", KeyInfoString, "data", - N_("sub directory for other data")} -#endif // // These options are generally used when creating dictionaries @@ -1574,7 +1557,10 @@ N_("suggest possible replacements"), KEYINFO_MAY_CHANGE} , {"time" , KeyInfoBool, "false", N_("time load time and suggest time in pipe mode"), KEYINFO_MAY_CHANGE} - + #ifdef WIN32PORT + , {"personal-dir", KeyInfoString, PERSONAL_DIR, + N_("directory for personal dictionaries")} + #endif }; const KeyInfo * config_impl_keys_begin = config_keys; @@ -1588,4 +1574,87 @@ config_impl_keys_end); } +#ifdef WIN32PORT + + String ReadRegString(HKEY hive, String key, String name) + { + + // Reads a string from the Windows registry (used to get paths) + + HKEY hKey; + unsigned long lType; + DWORD dwSize; + unsigned char* szValue = NULL; + + if (::RegOpenKeyEx(hive, key.c_str(), 0, KEY_READ, &hKey) == ERROR_SUCCESS) + { + if(::RegQueryValueEx(hKey, name.c_str(), NULL, &lType, NULL, &dwSize) == ERROR_SUCCESS) + { + szValue = new unsigned char[dwSize + 1]; + ::RegQueryValueEx(hKey, name.c_str(), NULL, &lType, szValue, &dwSize); + String RegistryReturn((char*)szValue); + delete[] szValue; + return RegistryReturn; + } else { + return ""; + } + } else { + return ""; + } + + } + + HKEY GetRegHive() + { + + // Check whether Aspell is installed for the current user or for all users + + String value; + + if (ReadRegString(HKEY_CURRENT_USER, "Software\\Aspell", "Base Path").empty()) + { + return HKEY_LOCAL_MACHINE; + } else { + return HKEY_CURRENT_USER; + } + + } + + String GetWindowsDir(String registry_name, String default_dir) + { + + String final_dir; + + // Get directory from registry + HKEY hive; + hive = GetRegHive(); + final_dir = ReadRegString(hive, "Software\\Aspell", registry_name); + + // Default location in "Documents and Settings" + if (final_dir.empty()) { + + char * dir = new char[MAX_PATH]; + LPITEMIDLIST items = 0; + HRESULT hand = SHGetSpecialFolderLocation(0, CSIDL_APPDATA, &items); + + if ((NOERROR == hand) && items) { + if (SHGetPathFromIDList(items, dir)) { + for (char *ptr = dir; *ptr; ++ptr) + if ('\\' == *ptr) + *ptr = '/'; + final_dir = dir; + final_dir.append("/Aspell/"); + final_dir.append(default_dir.c_str()); + } + CoTaskMemFree(items); + } + + } + + return final_dir; + + } + +#endif + } diff -riwBu -Xex aspell-setter-sep06/common/vector.hpp aspell-setter-sep06-modified/common/vector.hpp --- aspell-setter-sep06/common/vector.hpp 2005-10-13 09:42:54.000000000 +0200 +++ aspell-setter-sep06-modified/common/vector.hpp 2006-09-17 19:50:45.730606400 +0200 @@ -50,10 +50,10 @@ T * data_end() {return &*this->end();} T * pbegin() {return &*this->begin();} - T * pend() {return &*this->end();} + T * pend() {return &this->back()+1;} const T * pbegin() const {return &*this->begin();} - const T * pend() const {return &*this->end();} + const T * pend() const {return &this->back()+1;} template U * datap() { diff -riwBu -Xex aspell-setter-sep06/win32/dirs.h aspell-setter-sep06-modified/win32/dirs.h --- aspell-setter-sep06/win32/dirs.h 2005-10-13 13:29:34.000000000 +0200 +++ aspell-setter-sep06-modified/win32/dirs.h 2007-02-16 22:52:43.486492800 +0100 @@ -1,16 +1,26 @@ #ifndef dirs_h #define dirs_h -#ifdef WIN32_USE_EXECUTABLE_DIR -# define DATA_DIR "" -# define CONF_DIR "" -# define DICT_DIR "" +# define DATA_DIR "!data-dir" +# define DICT_DIR "!dict-dir" +# define PERSONAL_DIR "!personal-dir" +# define CONF_DIR "" + +#if defined(WIN32_USE_EXECUTABLE_DIR) +# define HOME_DIR "" +# define PERSONAL ".pws" +# define REPL ".prepl" # define PREFIX "!prefix" +#elif defined(WIN32_USE_PERSONAL_DIR) +# define HOME_DIR "!home-dir" +# define PERSONAL ".pws" +# define REPL ".prepl" +# define PREFIX "" #else -# define DATA_DIR "aspell-win32/data" -# define CONF_DIR "aspell-win32" -# define DICT_DIR "dicts" -# define PREFIX "aspell-win32" +# define HOME_DIR "<$HOME|./>" +# define PERSONAL ".aspell..pws" +# define REPL ".aspell..prepl" +# define PREFIX "" #endif #endif diff -riwBu -Xex aspell-setter-sep06/win32/settings.h aspell-setter-sep06-modified/win32/settings.h --- aspell-setter-sep06/win32/settings.h 2006-09-06 10:51:16.000000000 +0200 +++ aspell-setter-sep06-modified/win32/settings.h 2006-09-17 18:55:23.112916800 +0200 @@ -9,9 +9,6 @@ /* Defined if curses like POSIX Functions should be used */ #undef CURSES_ONLY -/* Defined if win32 relocation should be used */ -#define ENABLE_WIN32_RELOCATABLE 1 - /* Define to 1 if you have the header file. */ #undef HAVE_DLFCN_H