diff --git a/src/common/gamecode/laws.c b/src/common/gamecode/laws.c index f13c2ae17..ea1a0e356 100644 --- a/src/common/gamecode/laws.c +++ b/src/common/gamecode/laws.c @@ -3802,6 +3802,9 @@ defaultorders (void) skip_token(); /* skip the keyword */ cmd = strdup(getstrtoken()); new_order = parse_order(cmd, u->faction->locale); + *ordp = ord->next; + ord->next = NULL; + free_order(ord); #ifdef LASTORDER if (new_order) set_order(&u->lastorder, new_order); #else @@ -3810,13 +3813,11 @@ defaultorders (void) remove_exclusive(&u->orders); remove_exclusive(&u->old_orders); neworders = true; + ordp = &u->orders; /* we could have broken ordp */ } if (new_order) addlist(&u->old_orders, new_order); #endif free(cmd); - *ordp = ord->next; - ord->next = NULL; - free_order(ord); } else ordp = &ord->next; } diff --git a/src/common/kernel/reports.c b/src/common/kernel/reports.c index bcb7cfda2..57e60e419 100644 --- a/src/common/kernel/reports.c +++ b/src/common/kernel/reports.c @@ -165,10 +165,10 @@ report_item(const unit * owner, const item * i, const faction * viewer, const ch } +#define ORDERS_IN_NR 1 static size_t -buforder(char * bufp, size_t size, const order * ord) +buforder(char * bufp, size_t size, const order * ord, int mode) { - char * cmd = getcommand(ord); size_t tsize = 0, rsize; rsize = strlcpy(bufp, ", \"", size); @@ -176,8 +176,13 @@ buforder(char * bufp, size_t size, const order * ord) if (rsize>size) rsize = size-1; size -= rsize; bufp += rsize; - - rsize = strlcpy(bufp, cmd, size); + if (modesize) rsize = size-1; size -= rsize; @@ -187,7 +192,6 @@ buforder(char * bufp, size_t size, const order * ord) strcpy(bufp, "\""); ++tsize; } - free(cmd); return tsize; } @@ -589,7 +593,7 @@ bufunit(const faction * f, const unit * u, int indent, int mode) } #ifdef LASTORDER if (!isbattle && u->lastorder) { - rsize = buforder(bufp, size, u->lastorder); + rsize = buforder(bufp, size, u->lastorder, 0); if (rsize>size) rsize = size-1; size -= rsize; bufp += rsize; @@ -597,26 +601,24 @@ bufunit(const faction * f, const unit * u, int indent, int mode) #else if (!isbattle) { boolean printed = 0; - int i; - for (i=0;i!=2;++i) { - order * ord = (i==0)?u->old_orders:u->orders; - while (ord) { - if (is_repeated(ord)) { - if (printed==0) { - rsize = buforder(bufp, size, ord); - } else if (printed==1) { - rsize = strlcpy(bufp, ", ...", size); - } - if (rsize>size) rsize = size-1; + order * ord;; + for (ord=u->old_orders;ord;ord=ord->next) { + if (is_repeated(ord)) { + if (printednext; + } else break; + } + } + if (printedorders;ord;ord=ord->next) { + if (is_repeated(ord)) { + if (printedold_orders) break; } } #endif