extern int *islandid2arch;
+#define NEW(ptr) ((ptr)= mmalloc(sizeof(*ptr)))
+
+#define MCALLOC(array, count) ((array)= mcalloc(sizeof(*(array)) * (count)))
+
+#define MCALLOC_INITEACH(array, count, init_this) ({ \
+ MCALLOC((array), (count)); \
+ int initi; \
+ typeof(&(array)[0]) this; \
+ for (initi=0, this=(array); initi<(count); initi++, this++) { \
+ init_this; \
+ } \
+ })
+
+
#define ONDEMAND(pointer_lvalue, calloc_size_count) \
((pointer_lvalue) ? : \
((pointer_lvalue) = mcalloc(sizeof(*(pointer_lvalue)) * calloc_size_count)))
double val= value_route(ni, ia, 0);
printf("route value is %g\n", val);
} else if (!strcmp(arg,"search")) {
- results= mcalloc(sizeof(*results)*argc);
+ MCALLOC(results, argc);
max_dist= atoi(*argv++);
int resultsix= 0;
while ((arg= *argv++)) {
SQL_BIND(ss_neigh, 1, isle);
while (SQL_STEP(ss_neigh)) {
- Neighbour *add= mmalloc(sizeof(*add));
+ Neighbour *add;
+ NEW(add);
add->islandid= sqlite3_column_int(ss_neigh, 0);
add->dist= sqlite3_column_int(ss_neigh, 1);
add->next= head;
int *islandid2arch;
void setup_search(void) {
- neighbours= mcalloc(sizeof(*neighbours) * islandtablesz);
+ MCALLOC(neighbours, islandtablesz);
SQL_PREPARE(ss_neigh,
"SELECT biid, dist FROM routes WHERE aiid=?");
" SELECT DISTINCT archipelago\n"
" FROM islands\n"
" )");
- archnames= mcalloc(sizeof(*archnames) * max_narches);
- islandid2arch= mmalloc(sizeof(*islandid2arch) * islandtablesz);
- int i;
- for (i=0; i<islandtablesz; i++) islandid2arch[i]=-1;
+ MCALLOC(archnames, max_narches);
+ MCALLOC_INITEACH(islandid2arch, islandtablesz, *this=-1);
sqlite3_stmt *archs;
SQL_PREPARE(archs,
assert(di < islandtablesz);
if (!(ipa= ipairs[si])) {
- ipa= ipairs[si]= mcalloc(sizeof(*ipa) * islandtablesz);
+ ipairs[si]= MCALLOC(ipa, islandtablesz);
}
if ((ip= ipa[di]))
return ip;
- ipa[di]= ip= mmalloc(sizeof(*ip));
+ ipa[di]= NEW(ip);
ip->trades= 0;
ip->route_tail_value= -1;
IslandPair *ip= ipair_get_create(cols[1], cols[3]);
TradesBlock *block= ip->trades;
if (!block || ip->trades->ntrades >= TRADES_PER_BLOCK) {
- block= mmalloc(sizeof(*block));
+ NEW(block);
block->next= ip->trades;
ip->trades= block;
block->ntrades= 0;
goto found;
/* not found, add new end */
- search= mmalloc(sizeof(*search));
+ NEW(search);
search->commodid= commodid;
search->price= price;
search->next= *trades;
void setup_value(void) {
sqlite3_stmt *sst;
- int i;
commodstabsz= sql_single_int("SELECT max(commodid) FROM commods") + 1;
- commodstab= mmalloc(sizeof(*commodstab)*commodstabsz);
- for (i=0; i<commodstabsz; i++)
- commodstab[i].mass= commodstab[i].volu= -1;
+ MCALLOC_INITEACH(commodstab, commodstabsz,
+ this->mass= this->volu= -1
+ );
SQL_PREPARE(sst,
"SELECT commodid,unitmass,unitvolume FROM commods");
}
sqlite3_finalize(sst);
- ipairs= mcalloc(sizeof(*ipairs) * islandtablesz);
- itradeends= mcalloc(sizeof(*itradeends) * islandtablesz);
+ MCALLOC(ipairs, islandtablesz);
+ MCALLOC(itradeends, islandtablesz);
SQL_PREPARE(ss_ipair_dist,
" SELECT dist FROM dists\n"