Add standard checks to the assigning of a country name
Add check to ensure a country by that name does not exist. Ensure the length is not too long. Note this is a change behaviour for edit and change commands which used to silently truncate long names. Enforce that a country name can not have control characters in it. Ensure that a country name is not blank or just spaces.
This commit is contained in:
parent
17ad9fc5f2
commit
aa5861d10b
5 changed files with 44 additions and 28 deletions
|
@ -177,6 +177,7 @@ extern void agecontact(struct natstr *np);
|
||||||
extern int influx(struct natstr *np);
|
extern int influx(struct natstr *np);
|
||||||
|
|
||||||
extern struct natstr *nat_reset(struct natstr *, enum nat_status, coord, coord);
|
extern struct natstr *nat_reset(struct natstr *, enum nat_status, coord, coord);
|
||||||
|
extern int check_nat_name(char *cname);
|
||||||
|
|
||||||
extern int grant_btus(struct natstr *, int );
|
extern int grant_btus(struct natstr *, int );
|
||||||
|
|
||||||
|
|
|
@ -84,12 +84,10 @@ add(void)
|
||||||
}
|
}
|
||||||
natp = getnatp(coun);
|
natp = getnatp(coun);
|
||||||
p = getstarg(player->argp[2], "Country Name? ", buf);
|
p = getstarg(player->argp[2], "Country Name? ", buf);
|
||||||
if (p == 0 || *p == 0)
|
if (p ==0)
|
||||||
return RET_SYN;
|
return RET_SYN;
|
||||||
if (strlen(p) >= sizeof(cntryname)) {
|
if (!check_nat_name(p))
|
||||||
pr("Country name too long\n");
|
|
||||||
return RET_FAIL;
|
return RET_FAIL;
|
||||||
}
|
|
||||||
strcpy(cntryname, p);
|
strcpy(cntryname, p);
|
||||||
p = getstarg(player->argp[3], "Representative? ", buf);
|
p = getstarg(player->argp[3], "Representative? ", buf);
|
||||||
if (p == 0 || *p == 0)
|
if (p == 0 || *p == 0)
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
|
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include <ctype.h>
|
|
||||||
#include "commands.h"
|
#include "commands.h"
|
||||||
#include "news.h"
|
#include "news.h"
|
||||||
#include "optlist.h"
|
#include "optlist.h"
|
||||||
|
@ -41,12 +40,8 @@
|
||||||
int
|
int
|
||||||
chan(void)
|
chan(void)
|
||||||
{
|
{
|
||||||
char *temp;
|
|
||||||
struct natstr *natp;
|
|
||||||
char *p;
|
char *p;
|
||||||
natid cn;
|
|
||||||
int charge;
|
int charge;
|
||||||
int nonb;
|
|
||||||
int btucost;
|
int btucost;
|
||||||
char buf[1024];
|
char buf[1024];
|
||||||
struct natstr *us;
|
struct natstr *us;
|
||||||
|
@ -84,25 +79,8 @@ chan(void)
|
||||||
if ((p =
|
if ((p =
|
||||||
getstarg(player->argp[2], "New country name -- ", buf)) == 0)
|
getstarg(player->argp[2], "New country name -- ", buf)) == 0)
|
||||||
return RET_SYN;
|
return RET_SYN;
|
||||||
p[sizeof(us->nat_cnam) - 1] = 0;
|
if (!check_nat_name(p))
|
||||||
for (cn = 0; NULL != (natp = getnatp(cn)); cn++) {
|
|
||||||
if (!strcmp(p, natp->nat_cnam)) {
|
|
||||||
pr("Country #%d is already called `%s'!\n", cn, p);
|
|
||||||
return RET_FAIL;
|
return RET_FAIL;
|
||||||
}
|
|
||||||
}
|
|
||||||
nonb = 0;
|
|
||||||
for (temp = p; *temp != '\0'; temp++) {
|
|
||||||
if (iscntrl(*temp)) {
|
|
||||||
pr("No control characters allowed in country names!\n");
|
|
||||||
return RET_FAIL;
|
|
||||||
} else if (*temp != ' ')
|
|
||||||
nonb = 1;
|
|
||||||
}
|
|
||||||
if (!nonb) {
|
|
||||||
pr("Must have a non-blank name!\n");
|
|
||||||
return RET_FAIL;
|
|
||||||
}
|
|
||||||
player->dolcost += charge;
|
player->dolcost += charge;
|
||||||
player->btused += btucost;
|
player->btused += btucost;
|
||||||
strcpy(us->nat_cnam, p);
|
strcpy(us->nat_cnam, p);
|
||||||
|
|
|
@ -655,8 +655,10 @@ docountry(char op, int arg, char *p, struct natstr *np)
|
||||||
|
|
||||||
switch (op) {
|
switch (op) {
|
||||||
case 'n':
|
case 'n':
|
||||||
|
if (!check_nat_name(p))
|
||||||
|
return RET_SYN;
|
||||||
pr("Country name changed from %s to %s\n", np->nat_cnam, p);
|
pr("Country name changed from %s to %s\n", np->nat_cnam, p);
|
||||||
strncpy(np->nat_cnam, p, sizeof(np->nat_cnam) - 1);
|
strcpy(np->nat_cnam, p);
|
||||||
break;
|
break;
|
||||||
case 'r':
|
case 'r':
|
||||||
pr("Country representative changed from %s to %s\n",
|
pr("Country representative changed from %s to %s\n",
|
||||||
|
|
|
@ -34,6 +34,7 @@
|
||||||
#include <config.h>
|
#include <config.h>
|
||||||
|
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
#include <ctype.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <sys/stat.h>
|
#include <sys/stat.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
@ -41,6 +42,7 @@
|
||||||
#include "game.h"
|
#include "game.h"
|
||||||
#include "nat.h"
|
#include "nat.h"
|
||||||
#include "optlist.h"
|
#include "optlist.h"
|
||||||
|
#include "prototypes.h"
|
||||||
#include "tel.h"
|
#include "tel.h"
|
||||||
#include "xy.h"
|
#include "xy.h"
|
||||||
|
|
||||||
|
@ -112,3 +114,38 @@ nat_reset(struct natstr *natp, enum nat_status stat, coord x, coord y)
|
||||||
|
|
||||||
return natp;
|
return natp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
check_nat_name(char *cname)
|
||||||
|
{
|
||||||
|
struct natstr *natp;
|
||||||
|
natid cn;
|
||||||
|
int nonb;
|
||||||
|
char *temp;
|
||||||
|
|
||||||
|
if (strlen(cname) >= sizeof(natp->nat_cnam)) {
|
||||||
|
pr("Country name too long\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
nonb = 0;
|
||||||
|
for (temp = cname; *temp != '\0'; temp++) {
|
||||||
|
if (iscntrl(*temp)) {
|
||||||
|
pr("No control characters allowed in country names!\n");
|
||||||
|
return 0;
|
||||||
|
} else if (!isspace(*temp))
|
||||||
|
nonb = 1;
|
||||||
|
}
|
||||||
|
if (!nonb) {
|
||||||
|
pr("Country name can't be all blank\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (cn = 0; NULL != (natp = getnatp(cn)); cn++) {
|
||||||
|
if (!strcmp(cname, natp->nat_cnam)) {
|
||||||
|
pr("Country #%d is already called `%s'\n", cn, cname);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue