diff --git a/app/system/base/io.cpp b/app/system/base/io.cpp index 7634d79c..16e3de82 100644 --- a/app/system/base/io.cpp +++ b/app/system/base/io.cpp @@ -37,6 +37,7 @@ #include "system/language.h" #include "system/language_stdc.h" #include "system/language_amiga.h" +#include "system/language_posix.h" #include "system/filesystem.h" #include "system/filesystem_stdc.h" #include "system/filesystem_amiga.h" @@ -98,6 +99,9 @@ class Program* CreateProgram(int argc, char **argv) { class Language* CreateLanguage() { +#ifdef UNIX + return new PosixLanguage(); +#endif #ifdef AMIGA LocaleBase = (struct LocaleBase*)OpenLibrary(LOCALE_NAME, LOCALE_REV); if (LocaleBase != NULL) { diff --git a/app/system/language_posix.cpp b/app/system/language_posix.cpp new file mode 100644 index 00000000..6132a23a --- /dev/null +++ b/app/system/language_posix.cpp @@ -0,0 +1,118 @@ +/* + * Copyright (c) 2015 Carsten Larsen + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#include "clib.h" +#include "localize/lex.h" +#include "localize/tags.h" +#include "localize/help.h" +#include "localize/text.h" +#include "localize/ident.h" +#include "localize/kword.h" +#include "system/base/io.h" +#include "system/program.h" +#include "system/language_posix.h" + +#ifdef UNIX +#include +#include /* http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/ctype.h.html */ +#include /* http://pubs.opengroup.org/onlinepubs/9699919799/basedefs/locale.h.html */ +#include /* http://pubs.opengroup.org/onlinepubs/7908799/xsh/nl_types.h.html */ +#include + +PosixLanguage::PosixLanguage() : + Language() +{ + locale = newlocale(LC_ALL, "da_DK.ISO8859-15", (locale_t)0); + setlocale(LC_NUMERIC, "da_DK.ISO8859-15"); + conv = localeconv(); +} + +PosixLanguage::~PosixLanguage() +{ + freelocale(locale); +} + +bool PosixLanguage::CharIsAlNum(long unsigned int character) +{ + return (bool)isalnum_l((int)character, locale); +} + +bool PosixLanguage::CharIsAlpha(long unsigned int character) +{ + return (bool)isalpha_l((int)character, locale); +} + +bool PosixLanguage::CharIsCntrl(long unsigned int character) +{ + return (bool)iscntrl_l((int)character, locale); +} + +bool PosixLanguage::CharIsDigit(long unsigned int character) +{ + return (bool)isdigit_l((int)character, locale); +} + +bool PosixLanguage::CharIsPunct(long unsigned int character) +{ + return (bool)ispunct_l((int)character, locale); +} + +bool PosixLanguage::CharIsSpace(long unsigned int character) +{ + return (bool)isspace_l((int)character, locale); +} + +char PosixLanguage::GetFractionPoint() +{ + return *(conv->decimal_point); +} + +bool PosixLanguage::StrIsEqualLoc(const char* s1, const char* s2) +{ + size_t len = StrLen(s2) * 2; + char *tmp = new char[len]; + strxfrm(tmp, s2, len); + bool res = StrIsEqual(s1, tmp); + delete tmp; + return res; +} + +char* PosixLanguage::Translate(identhelpdef* def) +{ + return (char*)def->text; +} + +char* PosixLanguage::Translate(helptextdef* def) +{ + return (char*)def->text; +} + +char* PosixLanguage::Translate(textdef* def) +{ + return (char*)def->text; +} + +#endif diff --git a/app/system/language_posix.h b/app/system/language_posix.h new file mode 100644 index 00000000..7f31cace --- /dev/null +++ b/app/system/language_posix.h @@ -0,0 +1,65 @@ +/* + * Copyright (c) 2015 Carsten Larsen + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#ifndef _LANGUAGE_POSIX_H +#define _LANGUAGE_POSIX_H + +#include "localize/lex.h" +#include "localize/help.h" +#include "localize/text.h" +#include "localize/kword.h" +#include "system/language.h" + +#ifdef UNIX +#include +#include +#include +#endif + +class PosixLanguage : public Language { +public: + PosixLanguage(); + ~PosixLanguage(); + char GetFractionPoint(); + bool CharIsAlNum(unsigned long character); + bool CharIsAlpha(unsigned long character); + bool CharIsDigit(unsigned long character); + bool CharIsPunct(unsigned long character); + bool CharIsSpace(unsigned long character); + bool CharIsCntrl(unsigned long character); + bool StrIsEqualLoc(const char *s1, const char *s2); + +protected: + char* Translate(textdef *def); + char* Translate(helptextdef *def); + char* Translate(identhelpdef *def); + +private: + locale_t locale; + struct lconv *conv; +}; + +#endif diff --git a/app/system/language_stdc.cpp b/app/system/language_stdc.cpp index 96fda1c0..ebb03e8c 100644 --- a/app/system/language_stdc.cpp +++ b/app/system/language_stdc.cpp @@ -227,3 +227,4 @@ void StandardLanguage::SkipComments() } } while (skipping); } + diff --git a/configure b/configure index 0eb8962c..76a54473 100755 --- a/configure +++ b/configure @@ -51,6 +51,7 @@ APPSRCS=' app/system/graph_gtk.cpp app/system/language.cpp app/system/language_amiga.cpp + app/system/language_posix.cpp app/system/language_stdc.cpp app/system/preferences.cpp app/system/preferences_amiga.cpp