task deQ(PQueue* pq, int taskID) { int i; int found = 0; for(i = 0; i < pq->size; i++) { if (pq->queue[i].tid == taskID) { found = 1; break; } } task to_return; if (found && pq->size != 0) { to_return.tid = taskID; to_return.priority = pq->queue[i].tid; pq->queue[i].priority = 99999999; sortQ(pq); pq->size--; return to_return; } else { to_return.tid = -1; to_return.priority = -99; return to_return; } }
/* loadQ: load qrels from a named file; sort by topic then docno */ static struct qrel * loadQ (char *qrels, int *size) { FILE *fp; char *line; struct qrel *q; int i,n = 0; if ((fp = fopen (qrels, "r")) == NULL) error ("cannot open qrels file \"%s\"\n", qrels); while (getLine (fp)) n++; fclose (fp); if (n == 0) error ("qrel file \"%s\" is empty\n", qrels); q = localMalloc (n*sizeof (struct qrel)); if ((fp = fopen (qrels, "r")) == NULL) error ("cannot open qrels file \"%s\"\n", qrels); while ((line = getLine (fp))) { char *a[4]; int i, topic, rel; if ( split (line, a, 4) != 4 || (topic = naturalNumber (a[0])) < 0 || (rel = naturalNumber (a[3])) < 0 ) error ("syntax error in qrel file \"%s\" at line %d\n", qrels, i + 1); else { q[i].docno = localStrdup (a[2]); q[i].topic = topic; if (rel > G) rel = G; q[i].rel = rel; i++; } } /* for each topic, verify that docnos have not been duplicated */ sortQ (q, n); for (i = 1; i < n; i++) if (q[i].topic == q[i-1].topic && strcmp(q[i].docno,q[i-1].docno) == 0) error ( "duplicate docno (%s) for topic %d in qrels file \"%s\"\n", q[i].docno, q[i].topic, qrels ); *size = n; return q; }
task enQ(PQueue* pq, int t_id, int prior) { pq->elements_added++; task to_add; to_add.tid = t_id; to_add.priority = prior; to_add.time_added = pq->elements_added; int i; for(i = 0; i < pq->size; i++) { if (pq->queue[i].tid == t_id) { return to_add; } } pq->queue[pq->size] = to_add; pq->size++; sortQ(pq); return to_add; }