diff --git a/config/Doxyfile.in b/config/Doxyfile.in index 0f21a7d..06444a3 100644 --- a/config/Doxyfile.in +++ b/config/Doxyfile.in @@ -459,7 +459,7 @@ WARN_LOGFILE = # directories like "/usr/src/myproject". Separate the files or directories # with spaces. -INPUT = @abs_top_srcdir@/src +INPUT = @abs_top_srcdir@/src @abs_top_srcdir@/plugins # If the value of the INPUT tag contains directories, you can use the # FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp @@ -480,7 +480,7 @@ RECURSIVE = YES # excluded from the INPUT source files. This way you can easily exclude a # subdirectory from a directory tree whose root is specified with the INPUT tag. -EXCLUDE = @abs_top_srcdir@/src/testsuite +EXCLUDE = # The EXCLUDE_SYMLINKS tag can be used select whether or not files or # directories that are symbolic links (a Unix filesystem feature) are excluded @@ -494,7 +494,7 @@ EXCLUDE_SYMLINKS = NO # against the file with absolute path, so to exclude all test directories # for example use the pattern */test/* -EXCLUDE_PATTERNS = +EXCLUDE_PATTERNS = */testsuite/* # The EXAMPLE_PATH tag can be used to specify one or more files or # directories that contain example code fragments that are included (see diff --git a/config/sgpemv2-uninstalled.pc.in b/config/sgpemv2-uninstalled.pc.in new file mode 100644 index 0000000..214adf8 --- /dev/null +++ b/config/sgpemv2-uninstalled.pc.in @@ -0,0 +1,17 @@ +# pkg-config configuration file for sgpemv2 - UNINSTALLED version +prefix=@prefix@ +exec_prefix=${prefix} +libdir=@abs_top_builddir@ +includedir=@abs_top_srcdir@/src + +policies_dir=@datadir@/@PACKAGE@/policies +plugins_dir=@datadir@/@PACKAGE@/plugins + +Name: SGPEMv2 +Description: An educational simulator for process scheduling and management +Version: @PACKAGE_VERSION@ +URL: http://www.math.unipd.it/ +Requires: glibmm-2.4 >= 2.8 gthread-2.0 >= 2.8 +Libs: -L${libdir}/src/backend -lbackend +Libs.private: -lglibmm-2.4 -lgthread-2.0 +Cflags: -I${includedir}/backend diff --git a/config/sgpemv2.pc.in b/config/sgpemv2.pc.in new file mode 100644 index 0000000..fbbbb65 --- /dev/null +++ b/config/sgpemv2.pc.in @@ -0,0 +1,17 @@ +# pkg-config configuration file for sgpemv2 +prefix=@prefix@ +exec_prefix=${prefix} +libdir=@libdir@/@PACKAGE@ +includedir=${prefix}/include + +policies_dir=@datadir@/@PACKAGE@/policies +plugins_dir=@datadir@/@PACKAGE@/plugins + +Name: SGPEMv2 +Description: An educational simulator for process scheduling and management +Version: @PACKAGE_VERSION@ +URL: http://www.math.unipd.it/ +Requires: glibmm-2.4 >= 2.8 gthread-2.0 >= 2.8 +Libs: -L${libdir} -lbackend +Libs.private: -lglibmm-2.4 -lgthread-2.0 +Cflags: -I${includedir}/sgpemv2 diff --git a/m4/sgpemv2-dirs.m4 b/m4/sgpemv2-dirs.m4 new file mode 100644 index 0000000..11a425a --- /dev/null +++ b/m4/sgpemv2-dirs.m4 @@ -0,0 +1,81 @@ +dnl m4/sgpemv2-dirs.m4 - Copyright 2005, 2006, University +dnl of Padova, dept. of Pure and Applied +dnl Mathematics +dnl +dnl This file is part of SGPEMv2. +dnl +dnl This is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl SGPEMv2 is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with SGPEMv2; if not, write to the Free Software +dnl Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +dnl ---------- AC_PROG_SGPEMV2 --------------------- +dnl +dnl Synopsis: AC_PROG_SGPEMV2([min_version]) +dnl +dnl This macro checks if sgpemv2 is installed, and +dnl AC_SUBSTs the following variables: +dnl +dnl SGPEMV2_CFLAGS -> necessary includes for compiling +dnl plugins +dnl SGPEMV2_LIBS -> libraries to link against when +dnl building a loadable plugin +dnl SGPEMV2_POLICIES_DIR -> global policies directory +dnl SGPEMV2_PLUGINS_DIR -> global plugins directory +dnl +dnl This is particularly useful for plugin installation. +dnl It takes a parameter which is the minimal version +dnl installed of sgpemv2 this macro checks for. +dnl The parameter is mandatory. +dnl +dnl Example of usage: AC_PROG_SGPEMV2([0.1]) +dnl ------------------------------------------------ +AC_DEFUN([AC_PROG_SGPEMV2], +[ + PKG_PROG_PKG_CONFIG([0.20]) + + if test "x$1" = "x"; then + AC_MSG_FAILURE([Wrong number of parameters passed to macro AC@&t@_PROG_SGPEMV2. Please contact this package mantainer.]) + fi + + _pkg_sgpemv2_module="sgpemv2 >= $1" + + PKG_CHECK_MODULES([SGPEMV2], [$_pkg_sgpemv2_module], + :, AC_MSG_ERROR([$SGPEMV2_PKG_ERRORS])) + + AC_MSG_CHECKING([for sgpemv2 compiler flags]) + AC_MSG_RESULT([$SGPEMV2_CFLAGS]) + + AC_MSG_CHECKING([for sgpemv2 linking flags]) + AC_MSG_RESULT([$SGPEMV2_LIBS]) + + AC_MSG_CHECKING([for sgpemv2 policies default installation directory]) + SGPEMV2_POLICIES_DIR=`$PKG_CONFIG --variable=policies_dir "$_pkg_sgpemv2_module" 2>/dev/null` + if test "x$SGPEMV2_POLICIES_DIR" = "x"; then + AC_MSG_ERROR([Unable to retrieve value]) + else + AC_MSG_RESULT([$SGPEMV2_POLICIES_DIR]) + fi + + AC_MSG_CHECKING([for sgpemv2 plugins default installation directory]) + SGPEMV2_PLUGINS_DIR=`$PKG_CONFIG --variable=plugins_dir "$_pkg_sgpemv2_module" 2>/dev/null` + if test "x$SGPEMV2_PLUGINS_DIR" = "x"; then + AC_MSG_ERROR([Unable to retrieve value]) + else + AC_MSG_RESULT([$SGPEMV2_PLUGINS_DIR]) + fi + + AC_SUBST([SGPEMV2_POLICIES_DIR]) + AC_SUBST([SGPEMV2_PLUGINS_DIR]) + +])dnl ------- AC_PROG_SGPEMV2 ---------------------- + diff --git a/plugins/pyloader/AUTHORS b/plugins/pyloader/AUTHORS new file mode 100644 index 0000000..e515ca1 --- /dev/null +++ b/plugins/pyloader/AUTHORS @@ -0,0 +1,10 @@ + +Authors of SGPEMv2 + +Giovanni Giacobbi +Filippo Paparella +Paolo Santi +Matteo Settenvini +Marco Trevisan +Djina Verbanac +Luca Vezzaro diff --git a/src/backend/pyloader/Abstract.py b/plugins/pyloader/Abstract.py similarity index 100% rename from src/backend/pyloader/Abstract.py rename to plugins/pyloader/Abstract.py diff --git a/plugins/pyloader/Makefile.am b/plugins/pyloader/Makefile.am new file mode 100644 index 0000000..1a53c16 --- /dev/null +++ b/plugins/pyloader/Makefile.am @@ -0,0 +1,196 @@ +# Makefile.am - Copyright 2005, 2006, University +# of Padova, dept. of Pure and Applied +# Mathematics +# +# This file is part of SGPEMv2. +# +# This is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# SGPEMv2 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with SGPEMv2; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + +# extra calls +.PHONY : apidox + +# this should be the only recursive call +SUBDIRS = po + +# directories definition +localedir = @datadir@/locale +plugindir = $(SGPEMV2_PLUGINS_DIR) +sharedir = $(plugindir)/extras/pyloader +policiesdir = $(SGPEMV2_POLICIES_DIR) + +#define empty global variables +plugin_LTLIBRARIES = +noinst_HEADERS = +noinst_PYTHON = +EXTRA_DIST = +MAINTAINERCLEANFILES = +MOSTLYCLEANFILES = +CLEANFILES = + +# ############################################################ +# +# extra dist, cleanup and automake/aclocal flags +# +# ############################################################ + +ACLOCAL_AMFLAGS = -I m4 + +macros = m4/compilerflags.m4 \ + m4/linkingflags.m4 \ + m4/sgpemv2-dirs.m4 + +EXTRA_DIST += \ + config/config.rpath \ + config/mkinstalldirs \ + configure.ac \ + gettext.h \ + $(macros) + +# ############################################################ +# +# source : libpyloader.la +# +# ############################################################ + +plugin_LTLIBRARIES += libpyloader.la + +libpyloader_la_CPPFLAGS = \ + -I@top_srcdir@ \ + -DSHAREDIR="\"$(sharedir)\"" \ + -DLOCALEDIR="\"$(localedir)\"" \ + $(PYTHON_CPPFLAGS) \ + $(GLIBMM_CFLAGS) \ + $(SGPEMV2_CFLAGS) +libpyloader_la_CXXFLAGS = \ + $(VISIB_HIDDEN) +libpyloader_la_LIBADD = \ + $(PYTHON_LDFLAGS) \ + $(PYTHON_EXTRA_LIBS) \ + $(GLIBMM_LIBS) \ + $(SGPEMV2_LIBS) +libpyloader_la_LDFLAGS = \ + $(PYTHON_EXTRA_LDFLAGS) \ + $(LT_LDFLAGS) \ + -version-info 0:0:0 \ + -module + +# Please keep this in sorted order: +libpyloader_la_SOURCES = \ + python_policy.cc \ + python_policy_manager.cc \ + hook.cc + +noinst_HEADERS += \ + python_policy.hh \ + python_policy_manager.hh + +share_PYTHON = \ + Abstract.py \ + Policy.py \ + ScriptAdapter.py + +# ############################################################ +# +# C++ modules -> Python loadable modules +# +# ############################################################ + +proxies = sgpem.py +wrappers = sgpem_wrap.cc + +share_LTLIBRARIES = _sgpem.la +share_PYTHON += $(proxies) + +# static pattern rule +$(proxies) $(wrappers) : sgpem.i + test -d "$(@D)" || mkdir -p -- "$(@D)" + $(SWIG) $(SWIG_PYTHON_OPT) -o $@ $< + +_sgpem_la_INTERFACES = sgpem.i + +_sgpem_la_CPPFLAGS = \ + -I@top_srcdir@ \ + $(SWIG_PYTHON_CPPFLAGS) \ + $(GLIBMM_CFLAGS) \ + $(SGPEMV2_CFLAGS) +_sgpem_la_LDFLAGS = -module -export-dynamic \ + $(GLIBMM_LDFLAGS) +_sgpem_la_LIBADD = $(SGPEMV2_LIBS) \ + $(GLIBMM_LIBS) +_sgpem_la_SOURCES = $(wrappers) + +EXTRA_DIST += $(_sgpem_la_INTERFACES) +MOSTLYCLEANFILES += $(proxies) $(wrappers) + +# ############################################################ +# +# source : builtin-policies +# +# ############################################################ + +# built-in policies +policies_PYTHON = \ + builtin-policies/fcfs.py \ + builtin-policies/sjf.py + + +# ############################################################ +# +# check : testsuite +# +# ############################################################ + +if COND_TESTS + +# DEJATOOL = src/testsuite/example-test.exp + +noinst_PROGRAMS = \ + testsuite/test-pyloader + +testsuite_test_pyloader_CPPFLAGS = \ + -I@top_srcdir@ \ + -DSHAREDIR="\"$(sharedir)\"" \ + $(PYTHON_CPPFLAGS) \ + $(GLIBMM_CFLAGS) \ + $(GTHREAD_CFLAGS) \ + $(SGPEMV2_CFLAGS) +testsuite_test_pyloader_DEPENDENCIES = \ + libpyloader.la +testsuite_test_pyloader_LDFLAGS = \ + $(SGPEMV2_LIBS) \ + $(GLIBMM_LIBS) \ + $(GTHREAD_LIBS) \ + $(PYTHON_LDFLAGS) \ + $(PYTHON_EXTRA_LIBS) \ + $(PYTHON_EXTRA_LDFLAGS) +testsuite_test_pyloader_SOURCES = \ + testsuite/test-python_loader.cc \ + python_policy.cc \ + python_policy_manager.cc + +noinst_PYTHON += testsuite/python_loader_configure.py \ + testsuite/python_loader_sort_queue.py \ + testsuite/python_loader_is_preemptive.py \ + testsuite/python_loader_get_time_slice.py + + +# Workaround an automake bug that leaves behind some files +# while it's finishing the distcheck target +CLEANFILES += \ + testsuite/.libs/test-pyloader + +endif #~ if COND_TESTS + diff --git a/plugins/pyloader/NEWS b/plugins/pyloader/NEWS new file mode 100644 index 0000000..e69de29 diff --git a/src/backend/pyloader/Policy.py b/plugins/pyloader/Policy.py similarity index 100% rename from src/backend/pyloader/Policy.py rename to plugins/pyloader/Policy.py diff --git a/plugins/pyloader/README b/plugins/pyloader/README new file mode 100644 index 0000000..e69de29 diff --git a/src/backend/pyloader/ScriptAdapter.py b/plugins/pyloader/ScriptAdapter.py similarity index 100% rename from src/backend/pyloader/ScriptAdapter.py rename to plugins/pyloader/ScriptAdapter.py diff --git a/src/builtin-policies/fcfs.py b/plugins/pyloader/builtin-policies/fcfs.py similarity index 100% rename from src/builtin-policies/fcfs.py rename to plugins/pyloader/builtin-policies/fcfs.py diff --git a/src/builtin-policies/sjf.py b/plugins/pyloader/builtin-policies/sjf.py similarity index 100% rename from src/builtin-policies/sjf.py rename to plugins/pyloader/builtin-policies/sjf.py diff --git a/plugins/pyloader/configure.ac b/plugins/pyloader/configure.ac new file mode 100644 index 0000000..7773dd9 --- /dev/null +++ b/plugins/pyloader/configure.ac @@ -0,0 +1,160 @@ +# configure.ac - Copyright 2005, University +# of Padova, dept. of Pure and Applied +# Mathematics +# +# This file is part of SGPEMv2. +# +# This is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# SGPEMv2 is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with SGPEMv2; if not, write to the Free Software +# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +dnl ----------------- CONFIGURE --------------------- + +AC_INIT([sgpemv2-pyloader],[0.1],[matteo@member.fsf.org]) + +if test -f "`pwd`/configure.ac"; then + AC_MSG_FAILURE([ + ** This seems to be the pkg root directory. + ** Compiling here your sources is considered + ** as unpolite as exploring your nose with + ** your pinky whilst attending a wedding party. + ** Please create a new dir as described in + ** the README file, and then run configure + ** into it. If you think you've got it right, + ** please inform the mantainer of this error! + ** He'll thoroughfully bash his head on the wall.], + -1 ) +fi + +AC_GNU_SOURCE +AC_CONFIG_AUX_DIR(config) + +AC_CANONICAL_TARGET + +dnl starting automake +AM_INIT_AUTOMAKE([dejagnu dist-bzip2]) + +dnl gettext & libtool +AC_ARG_VAR([LT_LDFLAGS], +[You can use this variable to pass an option +to libtool when it is in linking mode (for +example, "-all-static")]) +AC_PROG_LIBTOOL +AM_GNU_GETTEXT([external]) +AM_GNU_GETTEXT_VERSION([0.14.1]) + +dnl PYTHON_VERSION is declared precious by AC_PYTHON_DEVEL, +dnl so don't use it here +PY_VERSION=2.3 +GTKMM_VERSION=2.8.0 +SGPEMV2_VERSION=0.1 + +dnl c++ compiler and flags +AC_PROG_CXX +AC_CHECK_CXXFLAG([CXXFLAGS], [Wall]) +AC_CHECK_CXXFLAG([CXXFLAGS], [pedantic]) +AC_CHECK_CXXFLAG([CXXFLAGS], [Wextra]) +AC_CHECK_CXXFLAG([CXXFLAGS], [Wno-long-long]) +AC_CHECK_LDFLAG([LDFLAGS], [--as-needed]) + +AC_PROG_INSTALL + +dnl make +AC_PROG_MAKE_SET + +dnl check for python and SWIG +AC_PYTHON_DEVEL([>= '$PY_VERSION']) +AC_PROG_SWIG +SWIG_ENABLE_CXX +SWIG_PYTHON + +dnl add pkg-config search path for sgpemv2-uninstalled.pc +dnl if we're building in a subdir of that pkg +_old_pkg_path=$[]PKG@&t@_CONFIG_PATH +if test -f "../../config/sgpemv2-uninstalled.pc"; then + export PKG_@&t@CONFIG_PATH="../../config:$PKG_CONFIG_PATH" +fi + +dnl check for sgpemv2! +AC_PROG_SGPEMV2([$SGPEMV2_VERSION]) + +dnl revert from old var +if test "x$_old_pkg_path" = "x"; then + unset -v PKG@&t@_CONFIG_PATH +else + export PKG@&t@_CONFIG_PATH="$_old_pkg_path" +fi + +dnl check for glib & cairo +PKG_CHECK_MODULES([GTHREAD], + [gthread-2.0 >= $GTKMM_VERSION], + :, AC_MSG_ERROR([$GTHREAD_PKG_ERRORS])) +PKG_CHECK_MODULES([GLIBMM], + [glibmm-2.4 >= $GTKMM_VERSION], + :, AC_MSG_ERROR([$GLIBMM_PKG_ERRORS])) + +dnl use DSO visibility tags for systems that supports it correctly +dnl (for example, GCC 4.0 and above) +dnl see http://gcc.gnu.org/wiki/Visibility for more informations +AH_TEMPLATE([SG_DLLEXPORT],[Attribute for objects to be exported from DSOs]) +AH_TEMPLATE([SG_DLLIMPORT],[Attribute for objects to be imported from DSOs]) +AH_TEMPLATE([SG_DLLLOCAL], [Attribute for objects local to current DSO]) +AH_TEMPLATE([SG_DLLPUBLIC],[Attribute for DSO public objects]) + +dnl for now it works only with GCC >= 4.0.0 +AC_MSG_CHECKING([whether GCC supports DSO visibility attributes]) +AC_LANG_PUSH([C++]) +AC_COMPILE_IFELSE( + AC_LANG_PROGRAM([], [ + #if defined __GNUC__ && (__GNUC__) >= 4 + return 0; + #else + bails out with a compilation error. + #endif + ]),[ + AC_MSG_RESULT([yes]) + AC_DEFINE([SG_DLLIMPORT],[/* intentionally left with no value */]) + AC_DEFINE([SG_DLLEXPORT],[__attribute__ ((visibility("default")))]) + AC_DEFINE([SG_DLLLOCAL],[__attribute__ ((visibility("hidden")))]) + AC_DEFINE([SG_DLLPUBLIC],[__attribute__ ((visibility("default")))]) + + AC_CHECK_CXXFLAG([VISIB_HIDDEN], [fvisibility=hidden]) + AC_SUBST([VISIB_HIDDEN]) + AC_CHECK_CXXFLAG([CXXFLAGS],[fvisibility-inlines-hidden]) + ],[ + AC_MSG_RESULT([no]) + AC_DEFINE([SG_DLLIMPORT],[/* unsupported */]) + AC_DEFINE([SG_DLLEXPORT],[/* unsupported */]) + AC_DEFINE([SG_DLLLOCAL],[/* unsupported */]) + AC_DEFINE([SG_DLLPUBLIC],[/* unsupported */]) +]) +AC_LANG_POP + +dnl see if we've to compile tests +AC_MSG_CHECKING([whether tests have to be built]) +AC_ARG_ENABLE([tests], + AS_HELP_STRING([--disable-tests], + [don't compile the tests provided with sgpemv2]), + [compile_tests="$enableval"], + [compile_tests="yes"]) +AC_MSG_RESULT([$compile_tests]) +AM_CONDITIONAL([COND_TESTS], [test "$compile_tests" = "yes"]) + +dnl output files +AC_CONFIG_HEADERS([config.h:config.h.in]) + +AC_CONFIG_FILES([ +Makefile +po/Makefile.in +]) +AC_OUTPUT diff --git a/plugins/pyloader/gettext.h b/plugins/pyloader/gettext.h new file mode 100644 index 0000000..fcd2d13 --- /dev/null +++ b/plugins/pyloader/gettext.h @@ -0,0 +1,83 @@ +/* Convenience header for conditional use of GNU . + Copyright (C) 1995-1998, 2000-2002, 2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU Library General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, + USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include + +#else + +/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which + chokes if dcgettext is defined as a macro. So include it now, to make + later inclusions of a NOP. We don't include + as well because people using "gettext.h" will not include , + and also including would fail on SunOS 4, whereas + is OK. */ +#if defined(__sun) +# include +#endif + +/* Many header files from the libstdc++ coming with g++ 3.3 or newer include + , which chokes if dcgettext is defined as a macro. So include + it now, to make later inclusions of a NOP. */ +#if defined(__cplusplus) && defined(__GNUG__) && (__GNUC__ >= 3) +# include +# if (__GLIBC__ >= 2) || _GLIBCXX_HAVE_LIBINTL_H +# include +# endif +#endif + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# define gettext(Msgid) ((const char *) (Msgid)) +# define dgettext(Domainname, Msgid) ((const char *) (Msgid)) +# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) +# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) + +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +/* Commodity macros -- added by Matteo Settenvini 2006-01-13 */ +#define _(x) (gettext(x)) +#define N_(x) (gettext_noop(x)) + +#endif /* _LIBGETTEXT_H */ diff --git a/src/backend/pyloader/hook.cc b/plugins/pyloader/hook.cc similarity index 100% rename from src/backend/pyloader/hook.cc rename to plugins/pyloader/hook.cc diff --git a/m4/ac_pkg_swig.m4 b/plugins/pyloader/m4/ac_pkg_swig.m4 similarity index 100% rename from m4/ac_pkg_swig.m4 rename to plugins/pyloader/m4/ac_pkg_swig.m4 diff --git a/m4/ac_python_devel.m4 b/plugins/pyloader/m4/ac_python_devel.m4 similarity index 100% rename from m4/ac_python_devel.m4 rename to plugins/pyloader/m4/ac_python_devel.m4 diff --git a/m4/ac_python_module.m4 b/plugins/pyloader/m4/ac_python_module.m4 similarity index 100% rename from m4/ac_python_module.m4 rename to plugins/pyloader/m4/ac_python_module.m4 diff --git a/plugins/pyloader/m4/compilerflags.m4 b/plugins/pyloader/m4/compilerflags.m4 new file mode 100644 index 0000000..a843dc6 --- /dev/null +++ b/plugins/pyloader/m4/compilerflags.m4 @@ -0,0 +1,60 @@ +dnl ************************************************** +dnl Copyright (C) 2004 Matteo Settenvini +dnl ************************************************** + +dnl ---------- AC_CHECK_CXXFLAG --------------------- +dnl This macro checks if a particular flag for the +dnl C++ compiler works. If it is so, it puts the flag +dnl into the first macro parameter. +dnl Example of usage : AC_CHECK_CXXFLAG([CXXFLAGS],[Wall]) +dnl ------------------------------------------------- +AC_DEFUN([AC_CHECK_CXXFLAG], +[ if test -z "$1" -o -z "$2"; then + AC_MSG_FAILURE([Wrong parameters passed to the m4 macro. +Please contact the package mantainer.]) + fi + AC_REQUIRE([AC_PROG_CXX])dnl + AC_MSG_CHECKING([whether $CXX supports the -$2 flag]) + ac_check_cxxflags=$CXXFLAGS + CXXFLAGS="-$2" + AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE( + AC_LANG_PROGRAM([], [return 0;]), + [AC_MSG_RESULT([yes]) + CXXFLAGS="$ac_check_cxxflags" + $1="-$2 $[$1]" ], + [AC_MSG_RESULT([no]) + CXXFLAGS=$ac_check_cxxflags ] + ) + AC_LANG_POP +])dnl ------- AC_CHECK_CXXFLAG ---------------------- + + + +dnl ---------- AC_CHECK_CFLAG --------------------- +dnl This macro checks if a particular flag for the +dnl C compiler works. If it is so, it adds the flag +dnl into the first macro parameter. +dnl Example of usage : AC_CHECK_CFLAG([CFLAGS],[Wall]) +dnl ------------------------------------------------- +AC_DEFUN([AC_CHECK_CFLAG], +[ if test -z "$1" -o -z "$2"; then + AC_MSG_FAILURE([Wrong parameters passed to the m4 macro. +Please contact the package mantainer.]) + fi + AC_REQUIRE([AC_PROG_CC])dnl + AC_MSG_CHECKING([whether $CC supports the -$2 flag]) + ac_check_cflags=$CFLAGS + CFLAGS="-$2" + AC_LANG_PUSH([C]) + AC_COMPILE_IFELSE( + AC_LANG_PROGRAM([], [return 0;]), + [AC_MSG_RESULT([yes]) + CFLAGS="$ac_check_cflags" + $1="-$2 $[$1]" ], + [AC_MSG_RESULT([no]) + CFLAGS=$ac_check_cflags ] + ) + AC_LANG_POP +])dnl ------- AC_CHECK_CFLAG ---------------------- + diff --git a/plugins/pyloader/m4/linkingflags.m4 b/plugins/pyloader/m4/linkingflags.m4 new file mode 100644 index 0000000..802cbe8 --- /dev/null +++ b/plugins/pyloader/m4/linkingflags.m4 @@ -0,0 +1,31 @@ +dnl ************************************************** +dnl Copyright (C) 2004 Matteo Settenvini +dnl ************************************************** + +dnl ---------- AX_CHECK_LDFLAG --------------------- +dnl This macro checks if a particular flag for the +dnl C++ compiler works. If it is so, it adds the flag +dnl to the end of the first parameter. +dnl Example of usage : AC_CHECK_LDFLAG([LDFLAGS],[--as-needed]) +dnl ------------------------------------------------- +AC_DEFUN([AC_CHECK_LDFLAG], +[ if test -z "$1" -o -z "$2"; then + AC_MSG_FAILURE([Wrong parameters passed to the m4 macro. +Please contact the package mantainer.]) + fi + AC_REQUIRE([AC_PROG_CC])dnl + AC_MSG_CHECKING([whether the linker supports the $2 flag]) + ac_check_ldflags=$LDFLAGS + LDFLAGS="-Wl,$2" + AC_LANG_PUSH([C]) + AC_LINK_IFELSE( + AC_LANG_PROGRAM([], [return 0;]), + [AC_MSG_RESULT([yes]) + LDFLAGS=$ac_check_ldflags + $1="-Wl,$2 $[$1]" ], + [AC_MSG_RESULT([no]) + LDFLAGS=$ac_check_ldflags ] + ) + AC_LANG_POP +])dnl ------- AC_CHECK_LDFLAG ---------------------- + diff --git a/plugins/pyloader/m4/sgpemv2-dirs.m4 b/plugins/pyloader/m4/sgpemv2-dirs.m4 new file mode 100644 index 0000000..11a425a --- /dev/null +++ b/plugins/pyloader/m4/sgpemv2-dirs.m4 @@ -0,0 +1,81 @@ +dnl m4/sgpemv2-dirs.m4 - Copyright 2005, 2006, University +dnl of Padova, dept. of Pure and Applied +dnl Mathematics +dnl +dnl This file is part of SGPEMv2. +dnl +dnl This is free software; you can redistribute it and/or modify +dnl it under the terms of the GNU General Public License as published by +dnl the Free Software Foundation; either version 2 of the License, or +dnl (at your option) any later version. +dnl +dnl SGPEMv2 is distributed in the hope that it will be useful, +dnl but WITHOUT ANY WARRANTY; without even the implied warranty of +dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +dnl GNU General Public License for more details. +dnl +dnl You should have received a copy of the GNU General Public License +dnl along with SGPEMv2; if not, write to the Free Software +dnl Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +dnl ---------- AC_PROG_SGPEMV2 --------------------- +dnl +dnl Synopsis: AC_PROG_SGPEMV2([min_version]) +dnl +dnl This macro checks if sgpemv2 is installed, and +dnl AC_SUBSTs the following variables: +dnl +dnl SGPEMV2_CFLAGS -> necessary includes for compiling +dnl plugins +dnl SGPEMV2_LIBS -> libraries to link against when +dnl building a loadable plugin +dnl SGPEMV2_POLICIES_DIR -> global policies directory +dnl SGPEMV2_PLUGINS_DIR -> global plugins directory +dnl +dnl This is particularly useful for plugin installation. +dnl It takes a parameter which is the minimal version +dnl installed of sgpemv2 this macro checks for. +dnl The parameter is mandatory. +dnl +dnl Example of usage: AC_PROG_SGPEMV2([0.1]) +dnl ------------------------------------------------ +AC_DEFUN([AC_PROG_SGPEMV2], +[ + PKG_PROG_PKG_CONFIG([0.20]) + + if test "x$1" = "x"; then + AC_MSG_FAILURE([Wrong number of parameters passed to macro AC@&t@_PROG_SGPEMV2. Please contact this package mantainer.]) + fi + + _pkg_sgpemv2_module="sgpemv2 >= $1" + + PKG_CHECK_MODULES([SGPEMV2], [$_pkg_sgpemv2_module], + :, AC_MSG_ERROR([$SGPEMV2_PKG_ERRORS])) + + AC_MSG_CHECKING([for sgpemv2 compiler flags]) + AC_MSG_RESULT([$SGPEMV2_CFLAGS]) + + AC_MSG_CHECKING([for sgpemv2 linking flags]) + AC_MSG_RESULT([$SGPEMV2_LIBS]) + + AC_MSG_CHECKING([for sgpemv2 policies default installation directory]) + SGPEMV2_POLICIES_DIR=`$PKG_CONFIG --variable=policies_dir "$_pkg_sgpemv2_module" 2>/dev/null` + if test "x$SGPEMV2_POLICIES_DIR" = "x"; then + AC_MSG_ERROR([Unable to retrieve value]) + else + AC_MSG_RESULT([$SGPEMV2_POLICIES_DIR]) + fi + + AC_MSG_CHECKING([for sgpemv2 plugins default installation directory]) + SGPEMV2_PLUGINS_DIR=`$PKG_CONFIG --variable=plugins_dir "$_pkg_sgpemv2_module" 2>/dev/null` + if test "x$SGPEMV2_PLUGINS_DIR" = "x"; then + AC_MSG_ERROR([Unable to retrieve value]) + else + AC_MSG_RESULT([$SGPEMV2_PLUGINS_DIR]) + fi + + AC_SUBST([SGPEMV2_POLICIES_DIR]) + AC_SUBST([SGPEMV2_PLUGINS_DIR]) + +])dnl ------- AC_PROG_SGPEMV2 ---------------------- + diff --git a/plugins/pyloader/po/Makevars b/plugins/pyloader/po/Makevars new file mode 100644 index 0000000..1ae831e --- /dev/null +++ b/plugins/pyloader/po/Makevars @@ -0,0 +1,41 @@ +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = Free Software Foundation, Inc. + +# This is the email address or URL to which the translators shall report +# bugs in the untranslated strings: +# - Strings which are not entire sentences, see the maintainer guidelines +# in the GNU gettext documentation, section 'Preparing Strings'. +# - Strings which use unclear terms or require additional context to be +# understood. +# - Strings which make invalid assumptions about notation of date, time or +# money. +# - Pluralisation problems. +# - Incorrect English spelling. +# - Incorrect formatting. +# It can be your email address, or a mailing list address where translators +# can write to without being subscribed, or the URL of a web page through +# which the translators can contact you. +MSGID_BUGS_ADDRESS = matteo@member.fsf.org + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = diff --git a/plugins/pyloader/po/POTFILES.in b/plugins/pyloader/po/POTFILES.in new file mode 100644 index 0000000..e69de29 diff --git a/src/backend/pyloader/python_policy.cc b/plugins/pyloader/python_policy.cc similarity index 100% rename from src/backend/pyloader/python_policy.cc rename to plugins/pyloader/python_policy.cc diff --git a/src/backend/pyloader/python_policy.hh b/plugins/pyloader/python_policy.hh similarity index 97% rename from src/backend/pyloader/python_policy.hh rename to plugins/pyloader/python_policy.hh index 5fcbdd9..9d6aaa1 100644 --- a/src/backend/pyloader/python_policy.hh +++ b/plugins/pyloader/python_policy.hh @@ -28,8 +28,8 @@ #include -#include "../policy.hh" -#include "../user_interrupt_exception.hh" +#include "policy.hh" +#include "user_interrupt_exception.hh" namespace sgpem { diff --git a/src/backend/pyloader/python_policy_manager.cc b/plugins/pyloader/python_policy_manager.cc similarity index 97% rename from src/backend/pyloader/python_policy_manager.cc rename to plugins/pyloader/python_policy_manager.cc index bde1fc4..634a858 100644 --- a/src/backend/pyloader/python_policy_manager.cc +++ b/plugins/pyloader/python_policy_manager.cc @@ -19,7 +19,7 @@ // Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "python_policy_manager.hh" -#include "../global_settings.hh" +#include "global_settings.hh" #include #include @@ -101,7 +101,7 @@ PythonPolicyManager::init() for_each(GlobalSettings::instance().policies_dir_begin(), GlobalSettings::instance().policies_dir_end(), pol_dirs_concat(importdirs)); - importdirs += " '" MODDIR "' ]\n"; + importdirs += " '" SHAREDIR "' ]\n"; PyRun_SimpleString(importdirs.c_str()); diff --git a/src/backend/pyloader/python_policy_manager.hh b/plugins/pyloader/python_policy_manager.hh similarity index 98% rename from src/backend/pyloader/python_policy_manager.hh rename to plugins/pyloader/python_policy_manager.hh index 85a2673..de76fc8 100644 --- a/src/backend/pyloader/python_policy_manager.hh +++ b/plugins/pyloader/python_policy_manager.hh @@ -25,7 +25,7 @@ #include -#include "../policy_manager.hh" +#include "policy_manager.hh" #include "python_policy.hh" namespace sgpem diff --git a/src/backend/pyloader/sgpem.i b/plugins/pyloader/sgpem.i similarity index 100% rename from src/backend/pyloader/sgpem.i rename to plugins/pyloader/sgpem.i diff --git a/src/testsuite/python_loader_configure.py b/plugins/pyloader/testsuite/python_loader_configure.py similarity index 100% rename from src/testsuite/python_loader_configure.py rename to plugins/pyloader/testsuite/python_loader_configure.py diff --git a/src/testsuite/python_loader_get_time_slice.py b/plugins/pyloader/testsuite/python_loader_get_time_slice.py similarity index 100% rename from src/testsuite/python_loader_get_time_slice.py rename to plugins/pyloader/testsuite/python_loader_get_time_slice.py diff --git a/src/testsuite/python_loader_is_preemptive.py b/plugins/pyloader/testsuite/python_loader_is_preemptive.py similarity index 100% rename from src/testsuite/python_loader_is_preemptive.py rename to plugins/pyloader/testsuite/python_loader_is_preemptive.py diff --git a/src/testsuite/python_loader_sort_queue.py b/plugins/pyloader/testsuite/python_loader_sort_queue.py similarity index 100% rename from src/testsuite/python_loader_sort_queue.py rename to plugins/pyloader/testsuite/python_loader_sort_queue.py diff --git a/src/testsuite/test-python_loader.cc b/plugins/pyloader/testsuite/test-python_loader.cc similarity index 91% rename from src/testsuite/test-python_loader.cc rename to plugins/pyloader/testsuite/test-python_loader.cc index 672fd80..5e07089 100644 --- a/src/testsuite/test-python_loader.cc +++ b/plugins/pyloader/testsuite/test-python_loader.cc @@ -22,13 +22,12 @@ * class and its closely related cousins. More documentation to be written * here, thanks very much. */ -#include "backend/pyloader/python_policy_manager.hh" -#include "backend/pyloader/python_policy.hh" -#include "backend/global_settings.hh" -#include "backend/schedulable_list.hh" -#include "backend/scheduler.hh" -#include "backend/user_interrupt_exception.hh" -#include "templates/smartp.hh" +#include "../python_policy_manager.hh" +#include "../python_policy.hh" +#include "global_settings.hh" +#include "schedulable_list.hh" +#include "scheduler.hh" +#include "user_interrupt_exception.hh" #include #include diff --git a/po/POTFILES.in b/po/POTFILES.in index 0ab9b25..a6c9b78 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -37,10 +37,6 @@ ./src/backend/schedulable_status.hh ./src/backend/process.cc ./src/backend/process.hh -./src/backend/pyloader/python_policy_manager.cc -./src/backend/pyloader/python_policy_manager.hh -./src/backend/pyloader/python_policy.cc -./src/backend/pyloader/python_policy.hh ./src/backend/schedulable_list.cc ./src/backend/schedulable_list.hh ./src/standard_io.cc diff --git a/po/sgpemv2.pot b/po/sgpemv2.pot index 0bca696..a6994ce 100644 --- a/po/sgpemv2.pot +++ b/po/sgpemv2.pot @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: matteo@member.fsf.org\n" -"POT-Creation-Date: 2006-03-05 23:32+0100\n" +"POT-Creation-Date: 2006-04-06 18:18+0200\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -16,17 +16,34 @@ msgstr "" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" -#: src/parse_opts.cc:92 +#: src/parse_opts.cc:89 +#, c-format +msgid "" +"[EE] Wrong number of parameters. Please see \n" +"%s --help\n" +msgstr "" + +#: src/parse_opts.cc:108 #, c-format msgid "" "SGPEMv2 is an educational software acting as a process scheduling simulator\n" "\n" "\n" -"Usage : sgpemv2 [options]\n" +"Usage : sgpemv2 [options] filename\n" "\n" "Options:\n" -"\t-h, --help this help you're reading\n" -"\t-n, --no-gui starts the program in command line mode\n" +"\t-h, --help this help you're reading\n" +"\t-N, --no-gui starts the program in command line mode\n" +"\t-P dir, --policies-dir=dir\n" +"\t add this directory to the default modules\n" +"\t search path\n" +"\t-M dir, --modules-dir=dir\n" +"\t add this directory to default plugin\n" +"\t search path\n" +"\n" +"Filename:\n" +"\t a valid SGPEMv2 XML file\n" +"\t to be opened.\n" "\n" "Long options are available only on GNU systems.\n" "\n" @@ -36,11 +53,11 @@ msgstr "" msgid "Exit" msgstr "" -#: src/graphical_terminal_io.cc:47 +#: src/graphical_terminal_io.cc:46 msgid "Textual Simulation Log" msgstr "" -#: src/graphical_terminal_io.cc:70 +#: src/graphical_terminal_io.cc:69 msgid "Send Command" msgstr "" @@ -70,11 +87,23 @@ msgstr "" #: src/text_simulation.cc:120 msgid "" "\n" +"ERROR: " +msgstr "" + +#: src/text_simulation.cc:122 +msgid "" +"\n" +"Simulation is now stopped" +msgstr "" + +#: src/text_simulation.cc:131 +msgid "" +"\n" "-- PAUSE COMMAND --\n" "Pauses the simulation. The next call to RUN will restart it." msgstr "" -#: src/text_simulation.cc:130 +#: src/text_simulation.cc:141 msgid "" "\n" "-- STOP COMMAND --\n" @@ -82,21 +111,21 @@ msgid "" "FIRST instant and start it." msgstr "" -#: src/text_simulation.cc:141 +#: src/text_simulation.cc:152 msgid "" "\n" "-- RESET COMMAND --\n" "Resets the simulation jumping back to the first instant." msgstr "" -#: src/text_simulation.cc:151 +#: src/text_simulation.cc:162 msgid "" "\n" "-- QUIT COMMAND --\n" "Exits the program." msgstr "" -#: src/text_simulation.cc:154 +#: src/text_simulation.cc:165 msgid "" "\n" "\n" @@ -104,7 +133,7 @@ msgid "" "\n" msgstr "" -#: src/text_simulation.cc:162 +#: src/text_simulation.cc:173 msgid "" "\n" "-- Do you really want me to explain what HELP means? --\n" @@ -112,7 +141,7 @@ msgid "" "\n" msgstr "" -#: src/text_simulation.cc:184 +#: src/text_simulation.cc:195 msgid "" "\n" "-- SetMode COMMAND --\n" @@ -128,20 +157,20 @@ msgid "" "animation\n" msgstr "" -#: src/text_simulation.cc:191 +#: src/text_simulation.cc:202 msgid "" "\n" "ERROR: wrong number of parameters.\n" "Type HELP SETMODE for the description of the sintax" msgstr "" -#: src/text_simulation.cc:200 +#: src/text_simulation.cc:211 msgid "" "\n" "ERROR: the second parameter can be only CONTINUOUS or STEP" msgstr "" -#: src/text_simulation.cc:208 +#: src/text_simulation.cc:219 msgid "" "\n" "-- GetMode COMMAND --\n" @@ -150,19 +179,19 @@ msgid "" "\tSTEP : if if the simulation is shown step-by-step" msgstr "" -#: src/text_simulation.cc:213 +#: src/text_simulation.cc:224 msgid "" "\n" "CONTINUOUS" msgstr "" -#: src/text_simulation.cc:215 +#: src/text_simulation.cc:226 msgid "" "\n" "STEP" msgstr "" -#: src/text_simulation.cc:222 +#: src/text_simulation.cc:233 msgid "" "\n" "-- SetTimer COMMAND --\n" @@ -173,21 +202,21 @@ msgid "" "\t must be an integer value > 0 and < 10000.\n" msgstr "" -#: src/text_simulation.cc:228 +#: src/text_simulation.cc:239 msgid "" "\n" "ERROR: wrong number of parameters.\n" "Type HELP SETTIMER for the description of the sintax" msgstr "" -#: src/text_simulation.cc:237 +#: src/text_simulation.cc:248 msgid "" "\n" "ERROR: the second parameter has a wrong value.\n" "Type HELP SETTIMER for the description of the sintax" msgstr "" -#: src/text_simulation.cc:245 +#: src/text_simulation.cc:256 msgid "" "\n" "-- GetTimer COMMAND --\n" @@ -195,7 +224,7 @@ msgid "" "waits between a step and the following one" msgstr "" -#: src/text_simulation.cc:258 +#: src/text_simulation.cc:269 msgid "" "\n" "-- JumpTo COMMAND --\n" @@ -206,28 +235,28 @@ msgid "" "\t must be an integer value >= 0" msgstr "" -#: src/text_simulation.cc:265 +#: src/text_simulation.cc:276 msgid "" "\n" "ERROR: wrong number of parameters.\n" "Type HELP JUMPTO for the description of the sintax" msgstr "" -#: src/text_simulation.cc:274 +#: src/text_simulation.cc:285 msgid "" "\n" "ERROR: the second parameter has a wrong value.\n" "Type HELP JUMPTO for the description of the sintax" msgstr "" -#: src/text_simulation.cc:282 +#: src/text_simulation.cc:293 msgid "" "\n" "-- GetPolicy COMMAND --\n" "Returns the name and the description of the current applied policy." msgstr "" -#: src/text_simulation.cc:292 +#: src/text_simulation.cc:303 msgid "" "\n" "-- GetPolicyAttributes COMMAND --\n" @@ -239,13 +268,13 @@ msgid "" "\twhether the parameter is REQUIRED" msgstr "" -#: src/text_simulation.cc:354 +#: src/text_simulation.cc:365 msgid "" "\n" "Command not recognized: " msgstr "" -#: src/text_simulation.cc:356 +#: src/text_simulation.cc:367 msgid "" "\n" "Typer HELP for a list of avaiable commands."