diff --git a/COPYING b/COPYING
index 13ffd26..7e56428 100644
--- a/COPYING
+++ b/COPYING
@@ -4,7 +4,7 @@
Star Traders: A Game of Interstellar Trading
============================================
-**Copyright © 1990–2021, John Zaitseff.**
+**Copyright © 1990–2022, John Zaitseff.**
The Star Traders game is free software that is distributed under the
terms of the GNU General Public License. The actual copyright on this
diff --git a/INSTALL b/INSTALL
index 0ae6151..593634a 100644
--- a/INSTALL
+++ b/INSTALL
@@ -29,8 +29,8 @@ Star Traders requires the following components for successful compilation
and installation:
1. A working C compiler conforming to ISO/IEC 9899:1999 (also known as
- C99). Any recent version of the GNU Compiler Collection (GCC) or the
- Clang LLVM Compiler is more than adequate.
+ C99) or later. Any recent version of the GNU Compiler Collection
+ (GCC) or the Clang LLVM Compiler is more than adequate.
2. An operating system ideally conforming to ISO/IEC 9945-1:2008 (POSIX)
or to the Open Group Single UNIX Specification version 4 or later.
@@ -143,11 +143,11 @@ This feature requires GNU Make and allows you to keep the source code
tree from being modified by the compilation process. To use this option,
create a separate `build` directory, then run ``configure``. For
example, if you placed the Star Traders source code tree in
-`$HOME/src/trader-7.16`, you could run something like::
+`$HOME/src/trader-7.17`, you could run something like::
- mkdir $HOME/build/trader-build-7.16
- cd $HOME/build/trader-build-7.16
- $HOME/src/trader-7.16/configure
+ mkdir $HOME/build/trader-build-7.17
+ cd $HOME/build/trader-build-7.17
+ $HOME/src/trader-7.17/configure
Once again, the `Autoconf manual`__ describes these options (and many
others).
@@ -205,42 +205,48 @@ Tested Systems
The following operating systems and compilers have been successfully
tested with this version of Star Traders:
-===================== ====== ===== ========================
-Linux distribution Arch Glibc Compiler
-===================== ====== ===== ========================
-Debian GNU/Linux Sid x86_64 2.31 GNU C Compiler 10.2.1
-Debian GNU/Linux Sid x86_64 2.31 Clang (LLVM) 11.0.1
-Debian GNU/Linux Sid i686 2.31 GNU C Compiler 10.2.1
-Debian GNU/Linux Sid i686 2.31 Clang (LLVM) 11.0.1
-Debian GNU/Linux 10.3 x86_64 2.28 GNU C Compiler 8.3.0
-Debian GNU/Linux 10.3 x86_64 2.28 Clang (LLVM) 7.0.1
-Ubuntu 20.10 x86_64 2.32 GNU C Compiler 10.2.0
-Ubuntu 20.10 x86_64 2.32 Clang (LLVM) 11.0.0
-Ubuntu 20.10 x86_64 2.32 NVIDIA HPC SDK 20.11
-Ubuntu 20.04 LTS x86_64 2.31 GNU C Compiler 9.3.0
-Ubuntu 20.04 LTS x86_64 2.31 Clang (LLVM) 10.0.0
-Ubuntu 18.04 LTS x86_64 2.27 GNU C Compiler 7.5.0
-Fedora 33 x86_64 2.32 GNU C Compiler 10.2.1
-CentOS 8.3 x86_64 2.28 GNU C Compiler 8.3.1
-CentOS 8.3 x86_64 2.28 Intel C/C++ 19.1.2.254
-CentOS 7.9 x86_64 2.17 GNU C Compiler 4.8.5
-OpenSUSE Leap 15.2 x86_64 2.26 GNU C Compiler 7.5.0
-===================== ====== ===== ========================
+==================================== ====== ===== ========================
+Linux distribution Arch Glibc Compiler
+==================================== ====== ===== ========================
+Debian GNU/Linux Unstable (Sid) x86_64 2.33 GNU C Compiler 12.1.0
+Debian GNU/Linux Unstable (Sid) x86_64 2.33 Clang (LLVM) 14.0.6
+Debian GNU/Linux 11.4 (Bullseye) x86_64 2.31 GNU C Compiler 10.2.1
+Debian GNU/Linux 11.4 (Bullseye) x86_64 2.31 Clang (LLVM) 11.0.1
+Ubuntu 22.04.1 LTS (Jammy Jellyfish) x86_64 2.35 GNU C Compiler 11.2.0
+Ubuntu 22.04.1 LTS (Jammy Jellyfish) x86_64 2.35 Clang (LLVM) 14.0.0
+Ubuntu 22.04.1 LTS (Jammy Jellyfish) x86_64 2.35 NVIDIA HPC SDK 22.7
+Ubuntu 20.04.4 LTS (Focal Fossa) x86_64 2.31 GNU C Compiler 9.4.0
+Ubuntu 18.04.6 LTS (Bionic Beaver) x86_64 2.27 GNU C Compiler 7.5.0
+Fedora Linux 36 x86_64 2.35 GNU C Compiler 12.1.1
+Red Hat Enterprise Linux 9.0 x86_64 2.34 GNU C Compiler 11.2.1
+Red Hat Enterprise Linux 8.6 x86_64 2.28 GNU C Compiler 8.5.0
+Red Hat Enterprise Linux 7.9 x86_64 2.17 GNU C Compiler 4.8.5
+Red Hat Enterprise Linux 6.10 x86_64 2.12 GNU C Compiler 4.4.7
+CentOS Stream 9 x86_64 2.34 GNU C Compiler 11.3.1
+CentOS Stream 8 x86_64 2.28 GNU C Compiler 8.5.0
+CentOS 7.9.2009 x86_64 2.17 GNU C Compiler 4.8.5
+Rocky Linux 8.6 x86_64 2.28 GNU C Compiler 8.5.0
+Rocky Linux 8.6 x86_64 2.28 Intel C Classic 2021.6.0
+Rocky Linux 8.6 x86_64 2.28 Intel oneAPI C 2022.1.0
+openSUSE Leap 15.4 x86_64 2.31 GNU C Compiler 7.5.0
+Arch Linux (2022.08.01) x86_64 2.36 GNU C Compiler 12.1.1
+==================================== ====== ===== ========================
-======================= ====== ============================ ============
-Operating system Arch Compiler Notes
-======================= ====== ============================ ============
-FreeBSD 12.2 x86_64 Clang (LLVM) 10.0.1 [#freebsd1]_
-NetBSD 9.1 x86_64 GNU C Compiler 7.5.0 [#netbsd1]_
-macOS 11.0 x86_64 Apple Clang (LLVM) 11.0.0 [#macos1]_
-macOS 11.0 x86_64 Apple Clang (LLVM) 11.0.0 [#macos2]_
-Solaris 11.4 (x86_64) x86_64 GNU C Compiler 7.3.0 [#solaris1]_
-Solaris 11.4 (x86_64) i386 Oracle Developer Studio 12.6 [#solaris2]_
-Solaris 11.4 (x86_64) x86_64 Oracle Developer Studio 12.6 [#solaris3]_
-Haiku R1/beta2 x86_64 GNU C Compiler 8.3.0
-Cygwin 3.1.7 (Win10) x86_64 GNU C Compiler 10.2.0
-Cygwin 3.1.7 (Win7 SP1) i686 GNU C Compiler 10.2.0
-======================= ====== ============================ ============
+========================= ====== ============================ ============
+Operating system Arch Compiler Notes
+========================= ====== ============================ ============
+FreeBSD 13.1 x86_64 Clang (LLVM) 13.0.0 [#freebsd1]_
+NetBSD 9.2 x86_64 GNU C Compiler 7.5.0 [#netbsd1]_
+macOS 12.5 x86_64 Apple Clang (LLVM) 13.1.6 [#macos1]_
+macOS 12.5 x86_64 Apple Clang (LLVM) 13.1.6 [#macos2]_
+Solaris 11.4.42 (x86_64) x86_64 GNU C Compiler 11.2.0 [#solaris1]_
+Solaris 11.4.42 (x86_64) i386 GNU C Compiler 11.2.0 [#solaris2]_
+Solaris 11.4.42 (x86_64) x86_64 Oracle Developer Studio 12.6 [#solaris3]_
+Solaris 11.4.42 (x86_64) i386 Oracle Developer Studio 12.6 [#solaris4]_
+Haiku R1/beta3 x86_64 GNU C Compiler 11.2.0
+Cygwin 3.3.5 (Windows 10) x86_64 GNU C Compiler 11.3.0
+Cygwin 3.3.5 (Windows 7) i686 GNU C Compiler 11.3.0
+========================= ====== ============================ ============
.. [#freebsd1] FreeBSD with the ``gettext``, ``gettext-runtime``,
``gettext-tools`` and ``libiconv`` binary packages installed with
@@ -276,13 +282,29 @@ Cygwin 3.1.7 (Win7 SP1) i686 GNU C Compiler 10.2.0
./configure --with-libintl-prefix=/usr/local/opt/gettext \
PKG_CONFIG_PATH=/usr/local/opt/ncurses/lib/pkgconfig
-.. [#solaris1] Using ``./configure CURSES_CFLAGS=-I/usr/include/ncurses``
+.. [#solaris1] Solaris,
+ using::
-.. [#solaris2] Using ``./configure CURSES_CFLAGS=-I/usr/include/ncurses
- CC='/opt/developerstudio12.6/bin/cc'``
+ export PKG_CONFIG_PATH=/usr/lib/64/pkgconfig
+ ./configure CC="gcc -m64"
-.. [#solaris3] Using ``./configure CURSES_CFLAGS=-I/usr/include/ncurses
- CC='/opt/developerstudio12.6/bin/cc -m64'``
+.. [#solaris2] Solaris,
+ using::
+
+ export PKG_CONFIG_PATH=/usr/lib/32/pkgconfig
+ ./configure CC="gcc -m32"
+
+.. [#solaris3] Solaris with Oracle Developer Studio,
+ using::
+
+ export PKG_CONFIG_PATH=/usr/lib/64/pkgconfig
+ ./configure CC="/opt/developerstudio12.6/bin/cc -m64"
+
+.. [#solaris4] Solaris with Oracle Developer Studio,
+ using::
+
+ export PKG_CONFIG_PATH=/usr/lib/32/pkgconfig
+ ./configure CC="/opt/developerstudio12.6/bin/cc -m32"
The following systems are known *not* to work at the current time; this
list is almost certainly not exhaustive:
@@ -290,8 +312,7 @@ list is almost certainly not exhaustive:
================ ====== ==================== ============
Operating system Arch Compiler Notes
================ ====== ==================== ============
-OpenBSD 6.8 x86_64 GNU C Compiler 4.2.1 [#openbsd1]_
-OpenBSD 6.8 x86_64 Clang (LLVM) 10.0.1 [#openbsd1]_
+OpenBSD 7.1 x86_64 Clang (LLVM) 13.0.0 [#openbsd1]_
================ ====== ==================== ============
.. [#openbsd1] The OpenBSD C library does not include
@@ -303,7 +324,7 @@ Git Repository
==============
You can always download the latest version of Star Traders directly from
-the Git repository on the ZAP Group server::
+the Git repository on The ZAP Group Australia server::
git clone git://git.zap.org.au/data/git/trader.git
@@ -313,7 +334,7 @@ repository, however, you will need to update these files yourself. You
will need the following additional tools installed on your system to do
so:
-1. `Autoconf`__ v2.69 or later
+1. `Autoconf`__ v2.71 or later
2. `Automake`__ v1.15 or later
3. `pkgconf`__ v0.9.0 or later, or `pkg-config`__ v0.29 or later
4. `GNU Portability Library`__
diff --git a/Makefile.am b/Makefile.am
index c1198b5..7d56c2f 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,7 +1,7 @@
#########################################################################
# #
# Star Traders: A Game of Interstellar Trading #
-# Copyright (C) 1990-2021, John Zaitseff #
+# Copyright (C) 1990-2022, John Zaitseff #
# #
#########################################################################
diff --git a/NEWS b/NEWS
index 2fb5857..5bd6948 100644
--- a/NEWS
+++ b/NEWS
@@ -12,8 +12,8 @@ money, in order to become the wealthiest player (the winner).
The following history is presented in reverse chronological order. If
you would like to see a list of detailed changes to this project, you
-should browse the `Star Traders Git repository`__ on `The ZAP Group web
-server`__.
+should browse the `Star Traders Git repository`__ on `The ZAP Group
+Australia web server`__.
__ https://www.zap.org.au/git-browser/trader.git
__ https://www.zap.org.au/
@@ -22,6 +22,24 @@ __ https://www.zap.org.au/
.. contents::
+Version 7.17 (3rd August, 2022)
+-------------------------------
+
+Fixed two TOCTOU (time-of-check / time-of-use) bugs that arose between
+checking for the traditional data directory and creating a data directory
+later. Also fixed a bug when the ``HOME`` environment variable is empty:
+use the current directory instead.
+
+Updated the Brazilian Portuguese, Norwegian Bokmål, Swedish, French,
+Esperanto, Serbian, German and English translations (in that order), with
+thanks to Rafael Fontenelle, Johnny A. Solbu, Anders Jonsson, Frédéric
+Marchal, Felipe Castro, Мирослав Николић and Roland Illig respectively.
+
+Updated the minimum version of GNU Autoconf required, giving the option
+of compiling with C17 or C11 instead of C99. Updated to the latest
+snapshot of the Gnulib GNU Portability Library.
+
+
Version 7.16 (19th January, 2021)
---------------------------------
diff --git a/README b/README
index 48f9016..9d592f4 100644
--- a/README
+++ b/README
@@ -55,7 +55,7 @@ Your comments, suggestions, corrections and enhancements are always
warmly welcomed! Please send these to:
:Postal: | John Zaitseff,
- | The ZAP Group,
+ | The ZAP Group Australia,
| Unit 6, 116 Woodburn Road,
| Berala, NSW, 2141,
| Australia
@@ -71,7 +71,7 @@ warmly welcomed! Please send these to:
Copyright
=========
-**Copyright © 1990–2021, John Zaitseff.**
+**Copyright © 1990–2022, John Zaitseff.**
Star Traders is free software that is distributed under the terms of the
GNU General Public License. You can redistribute it and/or modify it
diff --git a/configure.ac b/configure.ac
index 1929cfe..a49fd82 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
dnl *********************************************************************
dnl * *
dnl * Star Traders: A Game of Interstellar Trading *
-dnl * Copyright (C) 1990-2021, John Zaitseff *
+dnl * Copyright (C) 1990-2022, John Zaitseff *
dnl * *
dnl *********************************************************************
dnl
@@ -26,11 +26,11 @@ dnl You should have received a copy of the GNU General Public License
dnl along with this program. If not, see https://www.gnu.org/licenses/.
-AC_INIT([Star Traders], [7.16], [J.Zaitseff@zap.org.au], [trader],
+AC_INIT([Star Traders], [7.17], [J.Zaitseff@zap.org.au], [trader],
[https://www.zap.org.au/projects/trader/])
AC_DEFINE([PACKAGE_AUTHOR], ["John Zaitseff"], [Package author])
-AC_PREREQ([2.69])
+AC_PREREQ([2.71])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_SRCDIR([src/trader.c])
AC_CONFIG_AUX_DIR([build-aux])
@@ -40,9 +40,8 @@ AM_MAINTAINER_MODE([enable])
AC_CONFIG_LIBOBJ_DIR([lib])
AC_PROG_CC
-AC_PROG_CC_C99
-
-AS_IF([test "x$ac_cv_prog_cc_c99" = xno], [
+AS_CASE(["$ac_prog_cc_stdc"],
+ [c17|c11|c99], [], [
AC_MSG_ERROR([requires an ISO/IEC 9899:1999 (C99) compiler])
])
diff --git a/data/Makefile.am b/data/Makefile.am
index 29d8835..aa5cc94 100644
--- a/data/Makefile.am
+++ b/data/Makefile.am
@@ -1,7 +1,7 @@
#########################################################################
# #
# Star Traders: A Game of Interstellar Trading #
-# Copyright (C) 1990-2021, John Zaitseff #
+# Copyright (C) 1990-2022, John Zaitseff #
# #
#########################################################################
diff --git a/data/trader.appdata.xml.in b/data/trader.appdata.xml.in
index deb031f..790172c 100644
--- a/data/trader.appdata.xml.in
+++ b/data/trader.appdata.xml.in
@@ -4,7 +4,7 @@
*************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
*************************************************************************
@@ -33,7 +33,7 @@ warranty.
- trader.svg
+ trader.svg
trader.desktop
trader
diff --git a/data/trader.desktop.in b/data/trader.desktop.in
index 84bd585..4c18007 100644
--- a/data/trader.desktop.in
+++ b/data/trader.desktop.in
@@ -1,7 +1,7 @@
#########################################################################
# #
# Star Traders: A Game of Interstellar Trading #
-# Copyright (C) 1990-2021, John Zaitseff #
+# Copyright (C) 1990-2022, John Zaitseff #
# #
#########################################################################
diff --git a/data/trader.svg b/data/trader.svg
index 21ff9d7..d6c01e7 100644
--- a/data/trader.svg
+++ b/data/trader.svg
@@ -11,7 +11,7 @@
*************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
*************************************************************************
diff --git a/doc/Makefile.am b/doc/Makefile.am
index 9222ead..542b3c4 100644
--- a/doc/Makefile.am
+++ b/doc/Makefile.am
@@ -1,7 +1,7 @@
#########################################################################
# #
# Star Traders: A Game of Interstellar Trading #
-# Copyright (C) 1990-2021, John Zaitseff #
+# Copyright (C) 1990-2022, John Zaitseff #
# #
#########################################################################
diff --git a/doc/trader.6 b/doc/trader.6
index 130bf40..c000047 100644
--- a/doc/trader.6
+++ b/doc/trader.6
@@ -1,7 +1,7 @@
.\" *********************************************************************
.\" * *
.\" * Star Traders: A Game of Interstellar Trading *
-.\" * Copyright (C) 1990-2021, John Zaitseff *
+.\" * Copyright (C) 1990-2022, John Zaitseff *
.\" * *
.\" *********************************************************************
.\"
@@ -41,7 +41,7 @@
.if \n[.g] .mso www.tmac
.\"
.\" *********************************************************************
-.TH TRADER 6 "19th January, 2021" "Unix-like systems"
+.TH TRADER 6 "3rd August, 2022" "Unix-like systems"
.SH NAME
trader \- a game of interstellar trading
.\" *********************************************************************
@@ -194,7 +194,7 @@ its message catalogs instead of the compiled-in path; the relevant
.TP
.IB \(ti/.local/share/trader/game N
Star Traders stores saved game files in the \fI.local/share/trader\fP
-subdirectory in your home directory (unless overriden by the
+subdirectory in your home directory (unless overridden by the
\fBXDG_DATA_HOME\fP environment variable). \fIN\fP is a number between
\fB1\fP and \fB9\fP inclusive. The game file is scrambled to prevent you
or others from casually cheating!
@@ -213,7 +213,7 @@ warmly welcomed! Please send these to:
.IP Postal: 10n
\fBJohn Zaitseff\fP,
.br
-The ZAP Group,
+The ZAP Group Australia,
.br
Unit 6, 116 Woodburn Road,
.br
@@ -240,7 +240,7 @@ Australia
.PP
.\" *********************************************************************
.SH COPYRIGHT
-Copyright \(co 1990\-2021, John Zaitseff.
+Copyright \(co 1990\-2022, John Zaitseff.
.PP
\fBStar Traders\fP is free software that is distributed under the terms
of the GNU General Public License. You can redistribute it and/or modify
diff --git a/lib/.gitignore b/lib/.gitignore
index 2292ee1..69e6d40 100644
--- a/lib/.gitignore
+++ b/lib/.gitignore
@@ -4,12 +4,12 @@
/locale.h
/monetary.h
/stdio.h
+/stdlib.h
/string.h
+/sys/stat.h
+/sys/time.h
+/sys/types.h
/time.h
/unistd.h
-/unistr.h
-/unitypes.h
/wchar.h
/wctype.h
-
-/sys/
diff --git a/lib/unistr/.gitignore b/lib/unistr/.gitignore
index c83c013..e69de29 100644
--- a/lib/unistr/.gitignore
+++ b/lib/unistr/.gitignore
@@ -1 +0,0 @@
-/.dirstamp
diff --git a/lib/xopen-source.h b/lib/xopen-source.h
index 97d26ff..c31cbbc 100644
--- a/lib/xopen-source.h
+++ b/lib/xopen-source.h
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/m4/.gitignore b/m4/.gitignore
index e45e8d0..e69de29 100644
--- a/m4/.gitignore
+++ b/m4/.gitignore
@@ -1 +0,0 @@
-/gnulib-tool.m4
diff --git a/m4/Makefile.am b/m4/Makefile.am
index 3bdbb3c..ccf7ffc 100644
--- a/m4/Makefile.am
+++ b/m4/Makefile.am
@@ -1,7 +1,7 @@
#########################################################################
# #
# Star Traders: A Game of Interstellar Trading #
-# Copyright (C) 1990-2021, John Zaitseff #
+# Copyright (C) 1990-2022, John Zaitseff #
# #
#########################################################################
diff --git a/m4/ax_compiler_vendor.m4 b/m4/ax_compiler_vendor.m4
index f06e865..039f99d 100644
--- a/m4/ax_compiler_vendor.m4
+++ b/m4/ax_compiler_vendor.m4
@@ -12,10 +12,11 @@
# returned in the cache variable $ax_cv_c_compiler_vendor for C,
# $ax_cv_cxx_compiler_vendor for C++ or $ax_cv_fc_compiler_vendor for
# (modern) Fortran. The value is one of "intel", "ibm", "pathscale",
-# "clang" (LLVM), "cray", "fujitsu", "sdcc", "sx", "portland" (PGI), "gnu"
-# (GCC), "sun" (Oracle Developer Studio), "hp", "dec", "borland",
-# "comeau", "kai", "lcc", "sgi", "microsoft", "metrowerks", "watcom",
-# "tcc" (Tiny CC) or "unknown" (if the compiler cannot be determined).
+# "clang" (LLVM), "cray", "fujitsu", "sdcc", "sx", "nvhpc" (NVIDIA HPC
+# Compiler), "portland" (PGI), "gnu" (GCC), "sun" (Oracle Developer
+# Studio), "hp", "dec", "borland", "comeau", "kai", "lcc", "sgi",
+# "microsoft", "metrowerks", "watcom", "tcc" (Tiny CC) or "unknown" (if
+# the compiler cannot be determined).
#
# To check for a Fortran compiler, you must first call AC_FC_PP_SRCEXT
# with an appropriate preprocessor-enabled extension. For example:
@@ -58,7 +59,7 @@
# modified version of the Autoconf Macro, you may extend this special
# exception to the GPL to apply to your modified version as well.
-#serial 30
+#serial 32
AC_DEFUN([AX_COMPILER_VENDOR], [dnl
AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, [dnl
@@ -78,6 +79,7 @@ AC_DEFUN([AX_COMPILER_VENDOR], [dnl
fujitsu: __FUJITSU
sdcc: SDCC,__SDCC
sx: _SX
+ nvhpc: __NVCOMPILER
portland: __PGI
gnu: __GNUC__
sun: __SUNPRO_C,__SUNPRO_CC,__SUNPRO_F90,__SUNPRO_F95
diff --git a/m4/gnulib-cache.m4 b/m4/gnulib-cache.m4
index f5dd585..ed84135 100644
--- a/m4/gnulib-cache.m4
+++ b/m4/gnulib-cache.m4
@@ -1,8 +1,8 @@
-# Copyright (C) 2002-2021 Free Software Foundation, Inc.
+# Copyright (C) 2002-2022 Free Software Foundation, Inc.
#
# This file 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 3 of the License, or
+# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This file is distributed in the hope that it will be useful,
diff --git a/m4/xopen-source.m4 b/m4/xopen-source.m4
index fe75a4b..bc7adea 100644
--- a/m4/xopen-source.m4
+++ b/m4/xopen-source.m4
@@ -1,7 +1,7 @@
#########################################################################
# #
# Star Traders: A Game of Interstellar Trading #
-# Copyright (C) 1990-2021, John Zaitseff #
+# Copyright (C) 1990-2022, John Zaitseff #
# #
#########################################################################
diff --git a/po/LINGUAS b/po/LINGUAS
index 33e15ca..f0906ee 100644
--- a/po/LINGUAS
+++ b/po/LINGUAS
@@ -1,7 +1,7 @@
#########################################################################
# #
# Star Traders: A Game of Interstellar Trading #
-# Copyright (C) 1990-2021, John Zaitseff #
+# Copyright (C) 1990-2022, John Zaitseff #
# #
#########################################################################
diff --git a/po/Makevars b/po/Makevars
index a68f222..d6928e1 100644
--- a/po/Makevars
+++ b/po/Makevars
@@ -1,7 +1,7 @@
#########################################################################
# #
# Star Traders: A Game of Interstellar Trading #
-# Copyright (C) 1990-2021, John Zaitseff #
+# Copyright (C) 1990-2022, John Zaitseff #
# #
#########################################################################
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 047de6c..4f78e49 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,7 +1,7 @@
#########################################################################
# #
# Star Traders: A Game of Interstellar Trading #
-# Copyright (C) 1990-2021, John Zaitseff #
+# Copyright (C) 1990-2022, John Zaitseff #
# #
#########################################################################
diff --git a/po/da.po b/po/da.po
index 625bc84..74f62a1 100644
--- a/po/da.po
+++ b/po/da.po
@@ -1,7 +1,7 @@
# *************************************************************************
# * *
# * Danish Translations for Star Traders *
-# * Copyright (C) 2012-21, John Zaitseff *
+# * Copyright (C) 2012-22, John Zaitseff *
# * *
# *************************************************************************
#
@@ -12,10 +12,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:42+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 04:43+1000\n"
"Last-Translator: Joe Hansen \n"
"Language-Team: Danish \n"
"Language: da\n"
@@ -1250,12 +1250,12 @@ msgstr "%s: gemt med en tegnkodning der ikke er kompatibel"
msgid "%s: illegal or missing field on line %d"
msgstr "%s: ugyldigt eller manglende felt på linje %d"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Spil blev ikke gemt "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1266,7 +1266,7 @@ msgstr ""
"\n"
"^{Mappe %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1677,31 +1677,31 @@ msgctxt "answer"
msgid "No"
msgstr "Nej"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "ikke nok hukommelse"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: »%s«"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NUL"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: »%lc«"
diff --git a/po/de.po b/po/de.po
index a4c5171..f157773 100644
--- a/po/de.po
+++ b/po/de.po
@@ -1,7 +1,7 @@
# *************************************************************************
# * *
# * German Translations for Star Traders *
-# * Copyright (C) 2012-21, John Zaitseff *
+# * Copyright (C) 2012-22, John Zaitseff *
# * *
# *************************************************************************
#
@@ -10,14 +10,15 @@
# Contributors:
# Philipp Thomas , 2012, 2015, 2017.
# Mario Blättermann , 2021.
+# Roland Illig , 2022.
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 18:48+1100\n"
-"Last-Translator: Mario Blättermann \n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 06:21+1000\n"
+"Last-Translator: Roland Illig \n"
"Language-Team: German \n"
"Language: de\n"
"MIME-Version: 1.0\n"
@@ -50,8 +51,8 @@ msgid ""
"Star Traders is a simple game of interstellar trading, where the objective is to create companies, buy and sell shares, borrow "
"and repay money, in order to become the wealthiest player (the winner)."
msgstr ""
-"Star Traders ist ein einfaches Spiel um interstellaren Handel. Das Ziel des Spiels ist es, Firmen zu gründen, Aktien zu kaufen "
-"und zu verkaufen, Geld zu leihen und zurück zu zahlen, um der reichste Spieler und damit der Gewinner zu werden."
+"Star Traders ist ein einfaches interstellares Handelsspiel, bei dem es darum geht, Unternehmen zu gründen, Aktien zu kaufen und "
+"zu verkaufen, Geld zu leihen und zurückzuzahlen, um der reichste Spieler (der Gewinner) zu werden."
#: data/trader.appdata.xml.in:48
msgid "John Zaitseff"
@@ -1254,12 +1255,12 @@ msgstr "%s: unter einer inkompatiblen Zeichenkodierung abgespeichert"
msgid "%s: illegal or missing field on line %d"
msgstr "%s: unzulässiges oder fehlendes Feld in Zeile %d"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Spiel nicht gespeichert "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1270,7 +1271,7 @@ msgstr ""
"\n"
"^{Verzeichnis %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1677,31 +1678,31 @@ msgctxt "answer"
msgid "No"
msgstr "Nein"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "Kein freier Speicher mehr vorhanden"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: „%s“"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NUL"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: „%lc“"
diff --git a/po/en_AU.po b/po/en_AU.po
index 294745b..437f332 100644
--- a/po/en_AU.po
+++ b/po/en_AU.po
@@ -1,21 +1,21 @@
# *************************************************************************
# * *
# * English (Australian) Translations for Star Traders *
-# * Copyright (C) 1990-2021, John Zaitseff *
+# * Copyright (C) 1990-2022, John Zaitseff *
# * *
# *************************************************************************
#
# This file is distributed under the same license as the trader package.
#
# Contributors:
-# John Zaitseff , 2011-2021.
+# John Zaitseff , 2011-2022.
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:47+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 07:31+1000\n"
"Last-Translator: John Zaitseff \n"
"Language-Team: English (Australian) <(nothing)>\n"
"Language: en_AU\n"
@@ -48,8 +48,8 @@ msgid ""
"Star Traders is a simple game of interstellar trading, where the objective is to create companies, buy and sell shares, borrow "
"and repay money, in order to become the wealthiest player (the winner)."
msgstr ""
-"Star Traders is a simple game of interstellar trading, where the object of the game is to create companies, buy and sell shares, "
-"borrow and repay money, in order to become the wealthiest player (the winner)."
+"Star Traders is a simple game of interstellar trading, where the objective is to create companies, buy and sell shares, borrow "
+"and repay money, in order to become the wealthiest player (the winner)."
#: data/trader.appdata.xml.in:48
msgid "John Zaitseff"
@@ -1239,12 +1239,12 @@ msgstr "%s: saved under an incompatible character encoding"
msgid "%s: illegal or missing field on line %d"
msgstr "%s: illegal or missing field on line %d"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Game Not Saved "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1255,7 +1255,7 @@ msgstr ""
"\n"
"^{Directory %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1662,31 +1662,31 @@ msgctxt "answer"
msgid "No"
msgstr "No"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "out of memory"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: ‘%s’"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NUL"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: ‘%lc’"
diff --git a/po/en_CA.po b/po/en_CA.po
index 87fb860..8787fd1 100644
--- a/po/en_CA.po
+++ b/po/en_CA.po
@@ -1,21 +1,21 @@
# *************************************************************************
# * *
# * English (Canadian) Translations for Star Traders *
-# * Copyright (C) 1990-2021, John Zaitseff *
+# * Copyright (C) 1990-2022, John Zaitseff *
# * *
# *************************************************************************
#
# This file is distributed under the same license as the trader package.
#
# Contributors:
-# John Zaitseff , 2011-2021.
+# John Zaitseff , 2011-2022.
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:47+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 07:33+1000\n"
"Last-Translator: John Zaitseff \n"
"Language-Team: English (Canadian) <(nothing)>\n"
"Language: en_CA\n"
@@ -48,8 +48,8 @@ msgid ""
"Star Traders is a simple game of interstellar trading, where the objective is to create companies, buy and sell shares, borrow "
"and repay money, in order to become the wealthiest player (the winner)."
msgstr ""
-"Star Traders is a simple game of interstellar trading, where the object of the game is to create companies, buy and sell shares, "
-"borrow and repay money, in order to become the wealthiest player (the winner)."
+"Star Traders is a simple game of interstellar trading, where the objective is to create companies, buy and sell shares, borrow "
+"and repay money, in order to become the wealthiest player (the winner)."
#: data/trader.appdata.xml.in:48
msgid "John Zaitseff"
@@ -1239,12 +1239,12 @@ msgstr "%s: saved under an incompatible character encoding"
msgid "%s: illegal or missing field on line %d"
msgstr "%s: illegal or missing field on line %d"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Game Not Saved "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1255,7 +1255,7 @@ msgstr ""
"\n"
"^{Directory %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1662,31 +1662,31 @@ msgctxt "answer"
msgid "No"
msgstr "No"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "out of memory"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: ‘%s’"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NUL"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: ‘%lc’"
diff --git a/po/en_GB.po b/po/en_GB.po
index 0c58a41..ca994e1 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -1,21 +1,21 @@
# *************************************************************************
# * *
# * English (British) Translations for Star Traders *
-# * Copyright (C) 1990-2021, John Zaitseff *
+# * Copyright (C) 1990-2022, John Zaitseff *
# * *
# *************************************************************************
#
# This file is distributed under the same license as the trader package.
#
# Contributors:
-# John Zaitseff , 2011-2021.
+# John Zaitseff , 2011-2022.
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:48+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 07:34+1000\n"
"Last-Translator: John Zaitseff \n"
"Language-Team: English (British) <(nothing)>\n"
"Language: en_GB\n"
@@ -48,8 +48,8 @@ msgid ""
"Star Traders is a simple game of interstellar trading, where the objective is to create companies, buy and sell shares, borrow "
"and repay money, in order to become the wealthiest player (the winner)."
msgstr ""
-"Star Traders is a simple game of interstellar trading, where the object of the game is to create companies, buy and sell shares, "
-"borrow and repay money, in order to become the wealthiest player (the winner)."
+"Star Traders is a simple game of interstellar trading, where the objective is to create companies, buy and sell shares, borrow "
+"and repay money, in order to become the wealthiest player (the winner)."
#: data/trader.appdata.xml.in:48
msgid "John Zaitseff"
@@ -1239,12 +1239,12 @@ msgstr "%s: saved under an incompatible character encoding"
msgid "%s: illegal or missing field on line %d"
msgstr "%s: illegal or missing field on line %d"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Game Not Saved "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1255,7 +1255,7 @@ msgstr ""
"\n"
"^{Directory %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1662,31 +1662,31 @@ msgctxt "answer"
msgid "No"
msgstr "No"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "out of memory"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: ‘%s’"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NUL"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: ‘%lc’"
diff --git a/po/en_US.po b/po/en_US.po
index b54b592..995c1e7 100644
--- a/po/en_US.po
+++ b/po/en_US.po
@@ -1,21 +1,21 @@
# *************************************************************************
# * *
# * English (US) Translations for Star Traders *
-# * Copyright (C) 1990-2021, John Zaitseff *
+# * Copyright (C) 1990-2022, John Zaitseff *
# * *
# *************************************************************************
#
# This file is distributed under the same license as the trader package.
#
# Contributors:
-# John Zaitseff , 2011-2021.
+# John Zaitseff , 2011-2022.
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:48+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 07:35+1000\n"
"Last-Translator: John Zaitseff \n"
"Language-Team: English (US) <(nothing)>\n"
"Language: en_US\n"
@@ -48,8 +48,8 @@ msgid ""
"Star Traders is a simple game of interstellar trading, where the objective is to create companies, buy and sell shares, borrow "
"and repay money, in order to become the wealthiest player (the winner)."
msgstr ""
-"Star Traders is a simple game of interstellar trading, where the object of the game is to create companies, buy and sell shares, "
-"borrow and repay money, in order to become the wealthiest player (the winner)."
+"Star Traders is a simple game of interstellar trading, where the objective is to create companies, buy and sell shares, borrow "
+"and repay money, in order to become the wealthiest player (the winner)."
#: data/trader.appdata.xml.in:48
msgid "John Zaitseff"
@@ -1239,12 +1239,12 @@ msgstr "%s: saved under an incompatible character encoding"
msgid "%s: illegal or missing field on line %d"
msgstr "%s: illegal or missing field on line %d"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Game Not Saved "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1255,7 +1255,7 @@ msgstr ""
"\n"
"^{Directory %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1662,31 +1662,31 @@ msgctxt "answer"
msgid "No"
msgstr "No"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "out of memory"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: ‘%s’"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NUL"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: ‘%lc’"
diff --git a/po/eo.po b/po/eo.po
index 8738f62..edf4bce 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -1,22 +1,22 @@
# *************************************************************************
# * *
# * Esperanto Translations for Star Traders *
-# * Copyright (C) 2013-21, John Zaitseff *
-# * Copyright (C) 2013-20, Free Software Foundation, Inc. *
+# * Copyright (C) 2013-22, John Zaitseff *
+# * Copyright (C) 2013-21, Free Software Foundation, Inc. *
# * *
# *************************************************************************
#
# This file is distributed under the same license as the trader package.
#
# Contributors:
-# Felipe Castro , 2013, 2016, 2018, 2019, 2020.
+# Felipe Castro , 2013, 2016, 2018, 2019, 2020, 2021.
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:49+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 06:50+1000\n"
"Last-Translator: Felipe Castro \n"
"Language-Team: Esperanto \n"
"Language: eo\n"
@@ -240,7 +240,7 @@ msgstr "Herkulo kaj Ko"
#. Do not change or translate anything after the vertical line.
#: src/globals.c:68
msgid "ABCDEFGH|input|Companies"
-msgstr "abcdefgh|input|Companies"
+msgstr "ABCDEFGH|input|Companies"
#. TRANSLATORS: This string specifies the keycodes used to select a
#. game move. There must be exactly 20 characters, one for each
@@ -251,7 +251,7 @@ msgstr "abcdefgh|input|Companies"
#. the vertical line.
#: src/globals.c:80
msgid "ABCDEFGHIJKLMNOPQRST|input|GameMoves"
-msgstr "abcdefghijklmnoprstu|input|GameMoves"
+msgstr "ABCDEFGHIJKLMNOPQRST|input|GameMoves"
#. TRANSLATORS: This string is used to display the galaxy map to
#. screen. There must be exactly 11 characters before the ASCII
@@ -1246,12 +1246,12 @@ msgstr "%s: konservita sub nekongrua signa enkodigo"
msgid "%s: illegal or missing field on line %d"
msgstr "%s: malpermesata aŭ mankanta kampo en linio %d"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Seanco ne konservita "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1262,7 +1262,7 @@ msgstr ""
"\n"
"^{Dosierujo %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1669,31 +1669,31 @@ msgctxt "answer"
msgid "No"
msgstr "Ne"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "memoro plenpleniĝas"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: '%s'"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NUL"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: '%lc'"
diff --git a/po/fi.po b/po/fi.po
index de75339..e57b66d 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -1,7 +1,7 @@
# *************************************************************************
# * *
# * Finnish Translations for Star Traders *
-# * Copyright (C) 2012-21, John Zaitseff *
+# * Copyright (C) 2012-22, John Zaitseff *
# * Copyright (C) 2012, Free Software Foundation, Inc. *
# * *
# *************************************************************************
@@ -13,10 +13,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:50+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 06:57+1000\n"
"Last-Translator: Jorma Karvonen \n"
"Language-Team: Finnish \n"
"Language: fi\n"
@@ -1250,12 +1250,12 @@ msgstr "%s: tallennettu yhteensopimattomana merkkikoodauksena"
msgid "%s: illegal or missing field on line %d"
msgstr "%s: virheellinen tai puuttuva kenttä rivillä %d"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Peliä ei tallennettu "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1266,7 +1266,7 @@ msgstr ""
"\n"
"^{Hakemisto %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1673,31 +1673,31 @@ msgctxt "answer"
msgid "No"
msgstr "Ei"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "muisti loppui"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: ”%s”"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NUL"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: ”%lc”"
diff --git a/po/fr.po b/po/fr.po
index 67c6866..22accc4 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -1,15 +1,15 @@
# *************************************************************************
# * *
# * French Translations for Star Traders *
-# * Copyright (C) 2012-21, John Zaitseff *
-# * Copyright (C) 2012-19, Free Software Foundation, Inc. *
+# * Copyright (C) 2012-22, John Zaitseff *
+# * Copyright (C) 2012-21, Free Software Foundation, Inc. *
# * *
# *************************************************************************
#
# This file is distributed under the same license as the trader package.
#
# Contributors:
-# Frédéric Marchal , 2012, 2015, 2017, 2019.
+# Frédéric Marchal , 2012-2021.
#
# Attention: ce fichier ne doit pas contenir d'espace insécable car le
# programme est compilé avec Ncurses qui n'affiche pas correctement
@@ -19,10 +19,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:50+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 07:04+1000\n"
"Last-Translator: Frédéric Marchal \n"
"Language-Team: French \n"
"Language: fr\n"
@@ -56,8 +56,8 @@ msgid ""
"Star Traders is a simple game of interstellar trading, where the objective is to create companies, buy and sell shares, borrow "
"and repay money, in order to become the wealthiest player (the winner)."
msgstr ""
-"Star Traders est un simple jeu de commerce interstellaire où l'objectif du jeu est de créer des compagnies, acheter et vendre des "
-"parts, emprunter et rembourser de l'argent dans le but de devenir le joueur le plus riche (le gagnant)."
+"Star Traders est un simple jeu de commerce interstellaire où l'objectif consiste à créer des sociétés, acheter et vendre des "
+"actions, emprunter et rembourser de l'argent afin de devenir le joueur le plus riche (le gagnant)."
#: data/trader.appdata.xml.in:48
msgid "John Zaitseff"
@@ -1253,12 +1253,12 @@ msgstr "%s: enregistré avec un encodage des caractères incompatible"
msgid "%s: illegal or missing field on line %d"
msgstr "%s: champ illégal ou manquant à la ligne %d"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Jeu pas enregistré "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1269,7 +1269,7 @@ msgstr ""
"\n"
"^{Répertoire %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1688,31 +1688,31 @@ msgctxt "answer"
msgid "No"
msgstr "Non"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "pas assez de mémoire"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: « %s »"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NUL"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: « %lc »"
diff --git a/po/hr.po b/po/hr.po
index 34f25b2..f80ffb8 100644
--- a/po/hr.po
+++ b/po/hr.po
@@ -1,7 +1,7 @@
# *************************************************************************
# * *
# * Croatian Translations for Star Traders *
-# * Copyright (C) 2012-21, John Zaitseff *
+# * Copyright (C) 2012-22, John Zaitseff *
# * *
# *************************************************************************
#
@@ -12,10 +12,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:52+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 07:08+1000\n"
"Last-Translator: Tomislav Krznar \n"
"Language-Team: Croatian \n"
"Language: hr\n"
@@ -1250,12 +1250,12 @@ msgstr "%s: spremljena s nekompatibilnim kodiranjem znakova"
msgid "%s: illegal or missing field on line %d"
msgstr "%s: nedozvoljeno ili nedostaje polje u retku %d"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Igra nije spremljena "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1266,7 +1266,7 @@ msgstr ""
"\n"
"^{Direktorij %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1673,31 +1673,31 @@ msgctxt "answer"
msgid "No"
msgstr "Ne"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "nema dovoljno memorije"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: „%s”"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NUL"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: „%lc”"
diff --git a/po/hu.po b/po/hu.po
index cdf72eb..9da44ff 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -1,7 +1,7 @@
# *************************************************************************
# * *
# * Hungarian Translations for Star Traders *
-# * Copyright (C) 2012-21, John Zaitseff *
+# * Copyright (C) 2012-22, John Zaitseff *
# * *
# *************************************************************************
#
@@ -12,10 +12,10 @@
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:54+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 04:43+1000\n"
"Last-Translator: Balázs Úr \n"
"Language-Team: Hungarian \n"
"Language: hu\n"
@@ -1243,12 +1243,12 @@ msgstr "%s: egy nem kompatibilis karakterkódolással lett elmentve"
msgid "%s: illegal or missing field on line %d"
msgstr "%s: szabálytalan vagy hiányzó mező a(z) %d. sorban"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " A játék nincs elmentve "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1259,7 +1259,7 @@ msgstr ""
"\n"
"^{Könyvtár %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1667,31 +1667,31 @@ msgctxt "answer"
msgid "No"
msgstr "Nem"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "nincs elég memória"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: „%s”"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NUL"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: „%lc”"
diff --git a/po/nb.po b/po/nb.po
index e4e76ad..c7507af 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -1,23 +1,23 @@
# *************************************************************************
# * *
# * Norwegian Bokmål Translations for Star Traders *
-# * Copyright (C) 2012-21, John Zaitseff *
+# * Copyright (C) 2012-22, John Zaitseff *
# * *
# *************************************************************************
#
# This file is distributed under the same license as the trader package.
#
# Contributors:
-# Johnny A. Solbu , 2012-2019.
+# Johnny A. Solbu , 2012-2021.
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:54+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 07:13+1000\n"
"Last-Translator: Johnny A. Solbu \n"
-"Language-Team: Norwegian Bokmaal \n"
+"Language-Team: Norwegian Bokmaal \n"
"Language: nb\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1245,12 +1245,12 @@ msgstr "%s: lagret med en inkompatibel tegnkoding"
msgid "%s: illegal or missing field on line %d"
msgstr "%s: ulovlig eller manglende felt på linje %d"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Spill ikke lagret "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1261,7 +1261,7 @@ msgstr ""
"\n"
"^{Mappe %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1668,31 +1668,31 @@ msgctxt "answer"
msgid "No"
msgstr "Nei"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "ikke mer minne"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: «%s»"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NUL"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: «%lc»"
diff --git a/po/pt_BR.po b/po/pt_BR.po
index ef99ca1..76ae90c 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -2,21 +2,21 @@
# * *
# * Brazilian Portuguese Translations for Star Traders *
# * Traduções em português brasileiro para o pacote trader *
-# * Copyright (C) 2019-21, John Zaitseff *
+# * Copyright (C) 2019-22, John Zaitseff *
# * *
# *************************************************************************
#
# This file is distributed under the same license as the trader package.
#
# Contributors:
-# Rafael Fontenelle , 2019.
+# Rafael Fontenelle , 2019, 2021.
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:55+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 07:16+1000\n"
"Last-Translator: Rafael Fontenelle \n"
"Language-Team: Brazilian Portuguese \n"
"Language: pt_BR\n"
@@ -50,8 +50,8 @@ msgid ""
"Star Traders is a simple game of interstellar trading, where the objective is to create companies, buy and sell shares, borrow "
"and repay money, in order to become the wealthiest player (the winner)."
msgstr ""
-"Comerciantes Estelares é um jogo simples de negociação interestelar, cujo objetivo é criar empresas, comprar e vender ações, "
-"emprestar e pagar dinheiro, para se tornar o jogador mais rico (o vencedor)."
+"Comerciantes Estelares é um jogo simples de comércio interestelar, onde o objetivo é criar empresas, comprar e vender ações, "
+"pedir emprestado e devolver dinheiro, para se tornar o jogador mais rico (o vencedor)."
#: data/trader.appdata.xml.in:48
msgid "John Zaitseff"
@@ -1245,12 +1245,12 @@ msgstr "%s: salvo com uma codificação de caracteres incompatível"
msgid "%s: illegal or missing field on line %d"
msgstr "%s: campo ilegal ou faltando na linha %d"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Jogo não salvo "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1261,7 +1261,7 @@ msgstr ""
"\n"
"^{Diretório %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1669,31 +1669,31 @@ msgctxt "answer"
msgid "No"
msgstr "Não"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "memória esgotada"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: “%s”"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NULO"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: “%lc”"
diff --git a/po/ru.po b/po/ru.po
index d0a9022..60bf27b 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -2,23 +2,23 @@
# * *
# * Russian Translations for Star Traders *
# * Русский перевод для игры «Звёздные торговцы» *
-# * Copyright (C) 1990-2021, John Zaitseff *
+# * Copyright (C) 1990-2022, John Zaitseff *
# * *
# *************************************************************************
#
# This file is distributed under the same license as the trader package.
#
# Contributors:
-# John Zaitseff , 2011-2021.
+# John Zaitseff , 2011-2022.
# Vladimir B. Tsarkov , 2012.
# Pavel Maryanov , 2012.
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:56+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 07:19+1000\n"
"Last-Translator: John Zaitseff \n"
"Language-Team: Russian \n"
"Language: ru\n"
@@ -1255,12 +1255,12 @@ msgstr "%s: в файле используется неподдерживаем
msgid "%s: illegal or missing field on line %d"
msgstr "%s: неверное поле или отсутствующее поле в строке %d"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Игра не сохранена "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1271,7 +1271,7 @@ msgstr ""
"\n"
"^{Папка %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1678,31 +1678,31 @@ msgctxt "answer"
msgid "No"
msgstr "Нет"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "недостаточно памяти"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: «%s»"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NUL"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: «%lc»"
diff --git a/po/sr.po b/po/sr.po
index 7041cf5..c56cb8e 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -1,7 +1,7 @@
# *************************************************************************
# * *
# * Serbian Translation for Star Traders *
-# * Copyright (C) 2016-21, John Zaitseff *
+# * Copyright (C) 2016-22, John Zaitseff *
# * Copyright (C) 2016-17, Free Software Foundation, Inc. *
# * *
# *************************************************************************
@@ -9,14 +9,14 @@
# This file is distributed under the same license as the trader package.
#
# Contributors:
-# Мирослав Николић , 2016-2017.
+# Мирослав Николић , 2016-2021.
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:56+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 07:22+1000\n"
"Last-Translator: Мирослав Николић \n"
"Language-Team: Serbian <(nothing)>\n"
"Language: sr\n"
@@ -43,15 +43,15 @@ msgstr "Играјте Звездане трговце, једноставну
#. add your own keywords!
#: data/trader.desktop.in:27
msgid "game;interstellar;trading;strategy;"
-msgstr "игра;међузвездано;трговање;стратегиј;"
+msgstr "игра;међузвездано;трговање;стратегија;"
#: data/trader.appdata.xml.in:29
msgid ""
"Star Traders is a simple game of interstellar trading, where the objective is to create companies, buy and sell shares, borrow "
"and repay money, in order to become the wealthiest player (the winner)."
msgstr ""
-"Звездани трговци је једноставна игра међузвезданог трговања, у којој треба да оснивате предузећа, купујете и продајете акције, "
-"позајмљујете и враћате новац, да бисте постали најбогатији играч (победник)."
+"Звездани трговци је једноставна игра међузвезданог трговања, где је циљ стварање компанија, куповина и продаја акција, "
+"позајмљивање и враћање новца, како би се постао најбогатији играч (победник)."
#: data/trader.appdata.xml.in:48
msgid "John Zaitseff"
@@ -1247,12 +1247,12 @@ msgstr "%s: сачувана под несагласним кодирањем з
msgid "%s: illegal or missing field on line %d"
msgstr "%s: недозвољено или недостаје поље у %d. реду"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Игра није сачувана "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1263,7 +1263,7 @@ msgstr ""
"\n"
"^{Директоријум „%s“: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1670,31 +1670,31 @@ msgctxt "answer"
msgid "No"
msgstr "Не"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "нема више меморије"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: „%s“"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: НИШТА"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: „%lc“"
diff --git a/po/sv.po b/po/sv.po
index 3c3bf6f..be12c67 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -1,21 +1,21 @@
# *************************************************************************
# * *
# * Swedish Translations for Star Traders *
-# * Copyright (C) 2015-21, John Zaitseff *
+# * Copyright (C) 2015-22, John Zaitseff *
# * *
# *************************************************************************
#
# This file is distributed under the same license as the trader package.
#
# Contributors:
-# Anders Jonsson , 2015, 2017, 2020.
+# Anders Jonsson , 2015, 2017, 2020, 2021.
#
msgid ""
msgstr ""
-"Project-Id-Version: trader 7.16\n"
+"Project-Id-Version: trader 7.17\n"
"Report-Msgid-Bugs-To: J.Zaitseff@zap.org.au\n"
-"POT-Creation-Date: 2021-01-19 16:43+1100\n"
-"PO-Revision-Date: 2021-01-14 08:56+1100\n"
+"POT-Creation-Date: 2022-08-03 17:51+1000\n"
+"PO-Revision-Date: 2022-08-01 07:25+1000\n"
"Last-Translator: Anders Jonsson \n"
"Language-Team: Swedish \n"
"Language: sv\n"
@@ -49,8 +49,8 @@ msgid ""
"Star Traders is a simple game of interstellar trading, where the objective is to create companies, buy and sell shares, borrow "
"and repay money, in order to become the wealthiest player (the winner)."
msgstr ""
-"Star Traders är ett enkelt spel om interstellär handel, där spelets mål är att bilda företag, köpa och sälja aktier, låna och "
-"betala tillbaka pengar för att bli den rikaste spelaren (vinnaren)."
+"Star Traders är ett enkelt spel om interstellär handel, där målet är att skapa företag, köpa och sälja aktier, låna och betala "
+"tillbaka pengar, allt för att bli den rikaste spelaren (vinnaren)."
#: data/trader.appdata.xml.in:48
msgid "John Zaitseff"
@@ -1249,12 +1249,12 @@ msgstr "%s: sparat med en inkompatibel teckenkodning"
msgid "%s: illegal or missing field on line %d"
msgstr "%s: ogiltigt eller saknat fält på rad %d"
-#: src/fileio.c:473 src/fileio.c:494
+#: src/fileio.c:475 src/fileio.c:496
#, c-format
msgid " Game Not Saved "
msgstr " Spel ej sparat "
-#: src/fileio.c:474
+#: src/fileio.c:476
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1265,7 +1265,7 @@ msgstr ""
"\n"
"^{Katalog %s: %s^}"
-#: src/fileio.c:495
+#: src/fileio.c:497
#, c-format
msgid ""
"Game %d could not be saved to disk.\n"
@@ -1673,31 +1673,31 @@ msgctxt "answer"
msgid "No"
msgstr "Nej"
-#: src/utils.c:489 src/utils.c:510
+#: src/utils.c:596 src/utils.c:617
#, c-format
msgid "%s: "
msgstr "%s: "
-#: src/utils.c:515
+#: src/utils.c:622
msgid ": "
msgstr ": "
-#: src/utils.c:528
+#: src/utils.c:635
#, c-format
msgid "out of memory"
msgstr "slut på minne"
-#: src/utils.c:1265
+#: src/utils.c:1375
#, c-format
msgid "xmbstowcs: '%s'"
msgstr "xmbstowcs: ”%s”"
-#: src/utils.c:1305
+#: src/utils.c:1415
#, c-format
msgid "xwcrtomb: NUL"
msgstr "xwcrtomb: NUL"
-#: src/utils.c:1310
+#: src/utils.c:1420
#, c-format
msgid "xwcrtomb: '%lc'"
msgstr "xwcrtomb: ”%lc”"
diff --git a/src/Makefile.am b/src/Makefile.am
index bb7c04c..19eff4a 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,7 +1,7 @@
#########################################################################
# #
# Star Traders: A Game of Interstellar Trading #
-# Copyright (C) 1990-2021, John Zaitseff #
+# Copyright (C) 1990-2022, John Zaitseff #
# #
#########################################################################
diff --git a/src/exch.c b/src/exch.c
index 9946fc0..43c9857 100644
--- a/src/exch.c
+++ b/src/exch.c
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/src/exch.h b/src/exch.h
index c45427e..845bc9e 100644
--- a/src/exch.h
+++ b/src/exch.h
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/src/fileio.c b/src/fileio.c
index b56b672..9df1c18 100644
--- a/src/fileio.c
+++ b/src/fileio.c
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
@@ -246,7 +246,7 @@ bool load_game (int num)
filename = game_filename(num);
assert(filename != NULL);
- file = fopen(filename, "r");
+ file = game_fopen(num, "r");
if (file == NULL) {
// File could not be opened
@@ -438,6 +438,7 @@ bool load_game (int num)
bool save_game (int num)
{
const char *data_dir;
+ int data_dir_fd;
char *buf, *encbuf;
char *filename;
FILE *file;
@@ -464,7 +465,8 @@ bool save_game (int num)
// Create the data directory, if needed
data_dir = data_directory();
- if (data_dir != NULL) {
+ data_dir_fd = data_directory_fileno();
+ if (data_dir != NULL && data_dir_fd == -1) {
if (xmkdir(data_dir, S_IRWXU | S_IRWXG | S_IRWXO) != 0) {
// Data directory could not be created
saved_errno = errno;
@@ -484,7 +486,7 @@ bool save_game (int num)
filename = game_filename(num);
assert(filename != NULL);
- file = fopen(filename, "w");
+ file = game_fopen(num, "w");
if (file == NULL) {
// File could not be opened for writing
saved_errno = errno;
diff --git a/src/fileio.h b/src/fileio.h
index 7347d52..c8f3f7b 100644
--- a/src/fileio.h
+++ b/src/fileio.h
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/src/game.c b/src/game.c
index 5baaf5b..eaec4bb 100644
--- a/src/game.c
+++ b/src/game.c
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/src/game.h b/src/game.h
index 422ef93..1c5094d 100644
--- a/src/game.h
+++ b/src/game.h
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/src/globals.c b/src/globals.c
index bf70839..feba89f 100644
--- a/src/globals.c
+++ b/src/globals.c
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/src/globals.h b/src/globals.h
index 21283cf..75392a3 100644
--- a/src/globals.h
+++ b/src/globals.h
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/src/help.c b/src/help.c
index 23fb785..03d798f 100644
--- a/src/help.c
+++ b/src/help.c
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/src/help.h b/src/help.h
index 7f095fc..b7af565 100644
--- a/src/help.h
+++ b/src/help.h
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/src/intf.c b/src/intf.c
index 3e04a0c..4e84e3b 100644
--- a/src/intf.c
+++ b/src/intf.c
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/src/intf.h b/src/intf.h
index 639eee5..57d5bdd 100644
--- a/src/intf.h
+++ b/src/intf.h
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/src/move.c b/src/move.c
index 9bcd51b..a86ad9b 100644
--- a/src/move.c
+++ b/src/move.c
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/src/move.h b/src/move.h
index 68d3cbf..e6b9604 100644
--- a/src/move.h
+++ b/src/move.h
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/src/system.h b/src/system.h
index 52a518e..9ddc50a 100644
--- a/src/system.h
+++ b/src/system.h
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
@@ -69,6 +69,7 @@
#include
#include
+#include
#include
#include
#include
@@ -127,5 +128,14 @@
# define __attribute__(x)
#endif
+// Not all POSIX systems define O_SEARCH: use O_PATH or O_RDONLY instead
+#ifndef O_SEARCH
+# ifdef O_PATH
+# define O_SEARCH O_PATH
+# else
+# define O_SEARCH O_RDONLY
+# endif
+#endif
+
#endif /* included_SYSTEM_H */
diff --git a/src/trader.c b/src/trader.c
index b3a8053..22ec62b 100644
--- a/src/trader.c
+++ b/src/trader.c
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
@@ -296,7 +296,7 @@ This program is free software that is distributed under the terms of the\n\
GNU General Public License, version 3 or later. You are welcome to\n\
modify and/or distribute it under certain conditions. This program has\n\
NO WARRANTY, to the extent permitted by law; see the License for details.\n\
-"), program_name, PACKAGE_VERSION, "1990-2021");
+"), program_name, PACKAGE_VERSION, "1990-2022");
exit(EXIT_SUCCESS);
}
diff --git a/src/trader.h b/src/trader.h
index ed3ac12..64139c9 100644
--- a/src/trader.h
+++ b/src/trader.h
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
diff --git a/src/utils.c b/src/utils.c
index 2fd36c7..311e0a2 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
@@ -56,6 +56,7 @@ wchar_t *mon_thousands_sep; // Locale's monetary thousands separator
#define APPIMAGE_NAME "AppRun.wrapped"
#define DIRSEP "/" // Directory separator
+#define CURDIR "." // Current directory
#define HIDDEN_PATH "." // Hidden file start char
#define XDG_DATA_DEFAULT ".local" DIRSEP "share"
@@ -230,6 +231,7 @@ static const unsigned char xor_table[] = {
static char *home_directory_str = NULL; // Full pathname to home
static char *data_directory_str = NULL; // Writable data dir pathname
+static int data_directory_fd = -1; // Data dir file descriptor
static bool is_posix_locale = false; // Override strfmon()?
@@ -238,6 +240,31 @@ static bool is_posix_locale = false; // Override strfmon()?
* Module-specific function prototypes *
************************************************************************/
+/*
+ Function: home_directory - Return home directory pathname
+ Parameters: (none)
+ Returns: const char * - Pointer to home directory
+
+ This function returns the full pathname to the user's home directory,
+ using the HOME environment variable. Note that the existence of or
+ ability to write to this pathname is NOT checked by this function.
+ NULL is returned if the home directory cannot be determined.
+*/
+static const char *home_directory (void);
+
+
+/*
+ Function: game_rel_filename - Generate a relative game filename
+ Parameters: gamenum - Game number (1-9) as an integer
+ Returns: char * - Pointer to game filename string
+
+ This function returns a game filename, as a malloc()ed string, relative
+ to some current directory. If gamenum is outside the range 1 to 9
+ (inclusive), NULL is returned.
+*/
+extern char *game_rel_filename (int gamenum);
+
+
/*
Function: apply_xor - Scramble a buffer using xor_table
Parameters: dest - Location of destination buffer
@@ -301,7 +328,8 @@ static ssize_t b64decode (const void *restrict in, size_t inlen,
* Initialisation and environment function definitions *
************************************************************************/
-// These functions are documented in the file "utils.h"
+/* These functions are documented in the file "utils.h" or in the
+ comments above. */
/***********************************************************************/
@@ -348,6 +376,8 @@ const char *home_directory (void)
if (home != NULL && *home != '\0') {
home_directory_str = xstrdup(home);
+ } else {
+ home_directory_str = xstrdup(CURDIR);
}
}
@@ -369,8 +399,6 @@ const char *data_directory (void)
const char *dirsep_hiddenpath = DIRSEP HIDDEN_PATH;
const char *datahome_part = DIRSEP XDG_DATA_DEFAULT DIRSEP;
- struct stat statbuf;
-
assert(strlen(dirsep) == 1);
@@ -389,7 +417,8 @@ const char *data_directory (void)
strcat(p, dirsep_hiddenpath);
strcat(p, program_name);
- if (stat(p, &statbuf) == 0 && S_ISDIR(statbuf.st_mode)) {
+ data_directory_fd = open(p, O_DIRECTORY | O_SEARCH);
+ if (data_directory_fd != -1) {
// Directory "$HOME/.trader" exists: use that
data_directory_str = p;
} else {
@@ -431,10 +460,48 @@ const char *data_directory (void)
}
}
+ if (data_directory_str != NULL && data_directory_fd == -1) {
+ data_directory_fd = open(data_directory_str, O_DIRECTORY | O_SEARCH);
+ }
+
return data_directory_str;
}
+/***********************************************************************/
+// data_directory_fileno: Return file descriptor of data directory
+
+int data_directory_fileno (void)
+{
+ if (data_directory_fd == -1) {
+ (void) data_directory();
+ }
+
+ return data_directory_fd;
+}
+
+
+/***********************************************************************/
+// game_rel_filename: Generate a relative game filename
+
+char *game_rel_filename (int gamenum)
+{
+ /* This implementation assumes a POSIX environment and an ASCII-safe
+ character encoding. */
+
+ char *p;
+
+
+ if (gamenum < 1 || gamenum > 9) {
+ return NULL;
+ }
+
+ p = xmalloc(GAME_FILENAME_BUFSIZE);
+ snprintf(p, GAME_FILENAME_BUFSIZE, GAME_FILENAME_PROTO, gamenum);
+ return p;
+}
+
+
/***********************************************************************/
// game_filename: Convert an integer to a game filename
@@ -445,30 +512,70 @@ char *game_filename (int gamenum)
const char *dirsep = DIRSEP;
- char buf[GAME_FILENAME_BUFSIZE]; // Buffer for part of filename
+ char *gfn; // Relative game filename
const char *dd; // Data directory
-
- if (gamenum < 1 || gamenum > 9) {
+ gfn = game_rel_filename(gamenum);
+ if (gfn == NULL) {
return NULL;
}
dd = data_directory();
- snprintf(buf, GAME_FILENAME_BUFSIZE, GAME_FILENAME_PROTO, gamenum);
-
if (dd == NULL) {
- return xstrdup(buf);
+ return gfn;
} else {
- char *p = xmalloc(strlen(dd) + strlen(dirsep) + strlen(buf) + 1);
+ char *p = xmalloc(strlen(dd) + strlen(dirsep) + strlen(gfn) + 1);
strcpy(p, dd);
strcat(p, dirsep);
- strcat(p, buf);
+ strcat(p, gfn);
+ free(gfn);
return p;
}
}
+/***********************************************************************/
+// game_fopen: Open a game file for reading or writing
+
+FILE *game_fopen (int gamenum, const char *mode)
+{
+ char *gfn;
+ int ddfd;
+ int fd;
+ int oflag;
+ mode_t omode;
+
+
+ gfn = game_rel_filename(gamenum);
+ if (gfn == NULL) {
+ return NULL;
+ }
+
+ ddfd = data_directory_fileno();
+ if (ddfd == -1) {
+ ddfd = AT_FDCWD;
+ }
+
+ if (strcmp(mode, "r") == 0) {
+ oflag = O_RDONLY;
+ omode = 0;
+ } else if (strcmp(mode, "w") == 0) {
+ oflag = O_WRONLY | O_CREAT | O_TRUNC;
+ omode = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
+ } else {
+ free(gfn);
+ errno = EINVAL;
+ return NULL;
+ }
+
+ fd = openat(ddfd, gfn, oflag, omode);
+ free(gfn);
+
+ return (fd == -1) ? NULL : fdopen(fd, mode);
+}
+
+
/************************************************************************
* Error-reporting function definitions *
************************************************************************/
@@ -822,6 +929,7 @@ char *scramble (char *restrict dest, const char *restrict src,
// Place checksum in front of Base64 string
snprintf(chksumbuf, SCRAMBLE_CHKSUM_LEN + 1, "%03x", chksum);
memcpy(dest, chksumbuf, SCRAMBLE_CHKSUM_LEN);
+ dest[size - 1] = '\0'; // Keep Coverity Scan happy...
free(xorbuf);
}
@@ -1116,19 +1224,21 @@ int xmkdir (const char *pathname, mode_t mode)
return -1;
}
- // Check that pathname already exists and is a directory
- if (stat(pathname, &statbuf) == 0) {
- if (S_ISDIR(statbuf.st_mode)) {
- return 0;
- } else {
- errno = ENOTDIR;
- return -1;
- }
- }
-
// Try creating the directory
ret = mkdir(pathname, mode);
- if (ret == 0 || (errno != ENOENT && errno != ENOTDIR)) {
+ if (ret != 0 && errno == EEXIST) {
+ // Pathname exists: is it a directory?
+ if (stat(pathname, &statbuf) == 0) {
+ if (S_ISDIR(statbuf.st_mode)) {
+ return 0;
+ } else {
+ errno = ENOTDIR;
+ return -1;
+ }
+ } else {
+ return -1;
+ }
+ } else if (ret == 0 || (errno != ENOENT && errno != ENOTDIR)) {
return ret;
}
diff --git a/src/utils.h b/src/utils.h
index 8482c90..9f61930 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -1,7 +1,7 @@
/************************************************************************
* *
* Star Traders: A Game of Interstellar Trading *
-* Copyright (C) 1990-2021, John Zaitseff *
+* Copyright (C) 1990-2022, John Zaitseff *
* *
************************************************************************/
@@ -81,26 +81,14 @@ extern wchar_t *mon_thousands_sep; // Local monetary thousands separator
extern void init_program_name (const char *argv0);
-/*
- Function: home_directory - Return home directory pathname
- Parameters: (none)
- Returns: const char * - Pointer to home directory
-
- This function returns the full pathname to the user's home directory,
- using the HOME environment variable. Note that the existence of or
- ability to write to this pathname is NOT checked by this function.
- NULL is returned if the home directory cannot be determined.
-*/
-extern const char *home_directory (void);
-
-
/*
Function: data_directory - Return writable data directory pathname
Parameters: (none)
Returns: const char * - Pointer to data directory
This function returns the full pathname to a potentially-writable data
- directory, usually within the user's home directory.
+ directory, usually within the user's home directory. The pointer so
+ returned must NOT be passed to free().
Assuming program_name is set to "trader", if "$HOME/.trader" exists,
that directory is returned as the data directory. Otherwise, if the
@@ -109,12 +97,27 @@ extern const char *home_directory (void);
"$HOME/.local/share/trader" is returned.
Note that the returned path is NOT created by this function, nor is the
- ability to read from or write to this path checked. NULL is returned
- if the path cannot be determined.
+ ability to read from or write to this path checked. However, if the
+ path already exists, it is opened and used for game_fopen(); this may
+ be checked by running data_directory_fileno(). NULL is returned if the
+ path cannot be determined.
*/
extern const char *data_directory (void);
+/*
+ Function: data_directory_fileno - Return file descriptor of data directory
+ Parameters: (none)
+ Returns: int - File descriptor, or -1 on failure
+
+ This function returns the file descriptor of the potentially-writable
+ data directory returned by data_directory(), or -1 if that directory
+ does not exist. Note that this function does NOT create the data
+ directory itself.
+*/
+extern int data_directory_fileno (void);
+
+
/*
Function: game_filename - Convert an integer to a game filename
Parameters: gamenum - Game number (1-9) as an integer
@@ -122,14 +125,32 @@ extern const char *data_directory (void);
This function returns the full game filename as a malloc()ed string
(ie, a string that must be freed at a later time by calling free()).
+ This string is to be used for display ONLY, not as a parameter to
+ fopen(), to avoid issues of TOCTOU (time-of-check / time-of-use).
If gamenum is between 1 and 9 inclusive, the string returned is in the
- form data_directory() + "/" + GAME_FILENAME(gamenum). If gamenum is
- any other integer, NULL is returned.
+ form DATA_DIRECTORY + "/" + GAME_FILENAME(gamenum). If gamenum is any
+ other integer, NULL is returned.
*/
extern char *game_filename (int gamenum);
+/*
+ Function: game_fopen - Open a game file for reading or writing
+ Parameters: gamenum - Game number (1-9) as an integer
+ mode - File mode: "r" for reading, "w" for writing
+ Returns: FILE * - Pointer to open file structure
+
+ This function opens a game file for reading or writing, depending on
+ the mode string, returning a pointer to the open file structure. Note
+ that the data directory must be created before calling this function,
+ by checking whether data_directory_fileno() returns -1: if so, the
+ directory must be created. NULL is returned (and errno set) if the
+ file cannot be opened successfully.
+*/
+extern FILE *game_fopen (int gamenum, const char *mode);
+
+
/************************************************************************
* Error-reporting function prototypes *
************************************************************************/