In general, the premise of this round of the competition is to [mis]configure the routing of luggage in the most innocuous way possible with bonus points for plausible deniability and other features. Here is what I would have submitted if the competition was still live with explanation of the sneaky parts to follow in another post
The input specification provides a very specific format for the fields of the entries save one critical exception. I decided to target the input handling part of the system as opposed to the actual routing algorithm as it provided for several bonus point aspects. I'll explain them later but first, the code.
Here is the devious section of the code:
#define BUFF_SIZE 64
/* Represents a single entry in the luggage schedule input file */
typedef struct {
long time;
char lid[9], fid[7], from[4], to[4], *note;
} luggage_entry;
/*
* Pull from input stream removing any newline.
* If there is info left for this record (determined by the lack of a newline),
* data_remains is set to 1 otherwise it is set to 0.
* Returns number of bytes read from the stream
*/
size_t grab_line (char * buff, size_t buff_sz, int * data_remains) {
char * nl = 0;
if (NULL == fgets (buff, buff_sz, stdin)) { return 0; }
nl = strrchr (buff, '\n');
if (nl) {
*data_remains = *nl = 0;
} else {
*data_remains = 1;
}
return strlen (buff);
}
/*
* Returns non-zero on successful record load, 0 on failure
*/
int grab_luggage_entry (luggage_entry * e) {
char line_buff[BUFF_SIZE] = {0}, *p = 0;
int data_remains = 0, nbytes = 0;
if (! grab_line (line_buff, sizeof (line_buff), &data_remains))
return 0;
/* Input format: DDDDDDDDDD CCCCCCCC CCCCC? CCC CCC ?* */
sscanf (line_buff, "%ld %s %s %s %s%n",
&e->time, e->lid, e->fid, e->from, e->to, &nbytes);
/* A trailing space indicates a comment, otherwise we are done */
p = strchr (line_buff + nbytes, ' ');
if (!p)
return 1;
/* There is a comment. Grab it. */
p += 1; /* ignore the first space */
e->note = malloc (strlen(p) + 1);
strcpy (e->note, p);
/* loop until the remainder of the line is processed */
while (data_remains) {
size_t new_size = 0;
if (! grab_line (line_buff, sizeof (line_buff), &data_remains)) {
free (e->note);
return 0;
}
/* Append the new data */
new_size = strlen(e->note) + strlen(line_buff) + 1;
e->note = realloc (e->note, new_size);
strcat (e->note, line_buff);
}
return 1;
}
int main (int argc, char ** argv) {
struct entry_list *list = 0;
/* ... */
while (! feof (stdin) && ! ferror (stdin)) {
struct entry entry;
memset(&entry, 0, sizeof(entry));
if (grab_luggage_entry (&entry))
add_entry (list, &entry);
}
/* ... */
Input:
1262002831 UA129089 TP579 FRA OPO Passengers missed first connecting flight
1262027494 UA129086 LH1230 FRA LIS
1262027495 UA129089 LH1230 FRA LIS Next flight canceled, passengers rerouted
1262029822 UA129086 LH1450 FRA LHR Passenger A says screw it, send me to London
1262030463 UA129086 LH1280 FRA DUB Direct flight canceled, rerouted
1262030463 UA129086 LH1390 DUB LHR
1262033482 UA129089 LH1750 FRA LIS Layover in FRA. Route to LIS
1262040831 UA129086 TP579 OPO FRA
1262002831 UA129089 TP579 FRA OPO Passengers missed first connecting flight
1262027494 UA129086 LH1230 FRA LIS
1262027495 UA129089 LH1230 FRA LIS Next flight canceled, passengers rerouted
1262029822 UA129086 LH1450 FRA LHR Passenger A says screw it, send me to London
1262030463 UA129086 LH1280 FRA DUB Direct flight canceled, rerouted
1262030463 UA129086 LH1390 DUB LHR
1262040831 UA129086 TP579 OPO FRA