nsc filetable: Get rid of untidy use of PACKAGE_STRING
Table version selector version shows the version string stored in version[]. Its implementation is a bit of a hack: empfile[EF_VERSION].cache is set to version[], so it gets passed as context object to nstr_eval(). This permits reading version[] with an NSC_STRINGY selector at offset 0, which is what nsc_init()'s version_ca0 is. Both empfile[] and version_ca need the size of version[]. Since version.h provides only an incomplete type for version[], they use sizeof(PACKAGE_STRING), which isn't exactly clean. Redo version_ca0 as virtual selector. Takes a bit more code, but it's easier to understand. The context object is now unused. Setting empfile[EF_VERSION].cache to a null pointer would trip assertions, so make it point to a dummy. Signed-off-by: Markus Armbruster <armbru@pond.sub.org>
This commit is contained in:
parent
89a06ec2d4
commit
b4b65f0c35
2 changed files with 15 additions and 4 deletions
|
@ -51,7 +51,6 @@
|
||||||
#include "ship.h"
|
#include "ship.h"
|
||||||
#include "server.h"
|
#include "server.h"
|
||||||
#include "trade.h"
|
#include "trade.h"
|
||||||
#include "version.h"
|
|
||||||
#include "xy.h"
|
#include "xy.h"
|
||||||
|
|
||||||
static void sct_oninit(void *);
|
static void sct_oninit(void *);
|
||||||
|
@ -67,6 +66,8 @@ static void plchr_oninit(void *);
|
||||||
static void lchr_oninit(void *);
|
static void lchr_oninit(void *);
|
||||||
static void nchr_oninit(void *);
|
static void nchr_oninit(void *);
|
||||||
|
|
||||||
|
static char dummy_cache;
|
||||||
|
|
||||||
/* Number of elements in ARRAY. */
|
/* Number of elements in ARRAY. */
|
||||||
#define SZ(array) (sizeof(array) / sizeof((array)[0]))
|
#define SZ(array) (sizeof(array) / sizeof((array)[0]))
|
||||||
|
|
||||||
|
@ -225,7 +226,7 @@ struct empfile empfile[] = {
|
||||||
ARRAY_TABLE(empfile, EF_MAX, EFF_CFG),
|
ARRAY_TABLE(empfile, EF_MAX, EFF_CFG),
|
||||||
NULL, NULL, NULL, NULL},
|
NULL, NULL, NULL, NULL},
|
||||||
{EF_VERSION, "version", NULL, NULL, NULL, EF_BAD,
|
{EF_VERSION, "version", NULL, NULL, NULL, EF_BAD,
|
||||||
sizeof(PACKAGE_STRING), -1, EFF_STATIC, version, 1, 0, 1, 1, -1,
|
0, -1, EFF_MEM | EFF_STATIC, &dummy_cache, 1, 0, 1, 1, -1,
|
||||||
NULL, NULL, NULL, NULL},
|
NULL, NULL, NULL, NULL},
|
||||||
{EF_META, "meta", NULL, NULL, mdchr_ca, EF_BAD,
|
{EF_META, "meta", NULL, NULL, mdchr_ca, EF_BAD,
|
||||||
PTR_CACHE(mdchr_ca, EFF_CFG),
|
PTR_CACHE(mdchr_ca, EFF_CFG),
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
|
#include <limits.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "empobj.h"
|
#include "empobj.h"
|
||||||
#include "optlist.h"
|
#include "optlist.h"
|
||||||
|
@ -44,9 +45,11 @@
|
||||||
#include "nsc.h"
|
#include "nsc.h"
|
||||||
#include "product.h"
|
#include "product.h"
|
||||||
#include "unit.h"
|
#include "unit.h"
|
||||||
|
#include "version.h"
|
||||||
|
|
||||||
static void *nsc_ver(struct valstr *, struct natstr *, void *);
|
static void *nsc_ver(struct valstr *, struct natstr *, void *);
|
||||||
static void *nsc_ver_maxnoc(struct valstr *, struct natstr *, void *);
|
static void *nsc_ver_maxnoc(struct valstr *, struct natstr *, void *);
|
||||||
|
static void *nsc_ver_version(struct valstr *, struct natstr *, void *);
|
||||||
static void *nsc_sct_terr(struct valstr *, struct natstr *, void *);
|
static void *nsc_sct_terr(struct valstr *, struct natstr *, void *);
|
||||||
static void *nsc_sct_track(struct valstr *, struct natstr *, void *);
|
static void *nsc_sct_track(struct valstr *, struct natstr *, void *);
|
||||||
static void *nsc_cargo_nplane(struct valstr *, struct natstr *, void *);
|
static void *nsc_cargo_nplane(struct valstr *, struct natstr *, void *);
|
||||||
|
@ -755,8 +758,7 @@ void
|
||||||
nsc_init(void)
|
nsc_init(void)
|
||||||
{
|
{
|
||||||
static struct castr version_ca0 = {
|
static struct castr version_ca0 = {
|
||||||
"version", 0, NSC_STRINGY, sizeof(PACKAGE_STRING), NULL, EF_BAD, 0,
|
"version", 0, NSC_STRING, 0, nsc_ver_version, EF_BAD, 0, CA_DUMP
|
||||||
CA_DUMP
|
|
||||||
};
|
};
|
||||||
static struct castr version_ca1 = {
|
static struct castr version_ca1 = {
|
||||||
"maxnoc", 0, NSC_LONG, 0, nsc_ver_maxnoc, EF_BAD, 0, CA_DUMP
|
"maxnoc", 0, NSC_LONG, 0, nsc_ver_maxnoc, EF_BAD, 0, CA_DUMP
|
||||||
|
@ -820,6 +822,14 @@ nsc_ver_maxnoc(struct valstr *val, struct natstr *np, void *ptr)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *
|
||||||
|
nsc_ver_version(struct valstr *val, struct natstr *np, void *ptr)
|
||||||
|
{
|
||||||
|
val->val_as.str.base = version;
|
||||||
|
val->val_as.str.maxsz = INT_MAX; /* really SIZE_MAX, but that's C99 */
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
nsc_sct_terr(struct valstr *val, struct natstr *np, void *ptr)
|
nsc_sct_terr(struct valstr *val, struct natstr *np, void *ptr)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue