+ Z_ScanResponse *res = gdu->u.z3950->u.scanResponse;
+
+ if (res->entries && res->entries->nonsurrogateDiagnostics)
+ {
+ // failure
+ mp::odr odr;
+ Z_APDU *f_apdu = odr.create_scanResponse(apdu_req, 1, 0);
+ Z_ScanResponse *f_res = f_apdu->u.scanResponse;
+
+ f_res->entries->nonsurrogateDiagnostics =
+ res->entries->nonsurrogateDiagnostics;
+ f_res->entries->num_nonsurrogateDiagnostics =
+ res->entries->num_nonsurrogateDiagnostics;
+
+ package.response() = f_apdu;
+ return;
+ }
+
+ if (res->entries && res->entries->entries)
+ {
+ Z_Entry **entries = res->entries->entries;
+ int num_entries = res->entries->num_entries;
+ int position = 1;
+ if (req->preferredPositionInResponse)
+ position = *req->preferredPositionInResponse;
+ if (res->positionOfTerm)
+ position = *res->positionOfTerm;
+
+ // before
+ int i;
+ for (i = 0; i<position-1 && i<num_entries; i++)
+ {
+ Z_Entry *ent = entries[i];
+
+ if (ent->which == Z_Entry_termInfo)
+ {
+ ScanTermInfo my;
+
+ Odr_int *occur = ent->u.termInfo->globalOccurrences;
+ my.m_count = occur ? *occur : 0;
+
+ if (ent->u.termInfo->term->which == Z_Term_general)
+ {
+ my.m_norm_term = std::string(
+ (const char *)
+ ent->u.termInfo->term->u.general->buf,
+ ent->u.termInfo->term->u.general->len);
+ }
+ if (my.m_norm_term.length())
+ {
+ ScanTermInfoList::iterator it =
+ entries_before.begin();
+ while (it != entries_before.end() && my <*it)
+ it++;
+ if (it != entries_before.end() && my == *it)
+ {
+ it->m_count += my.m_count;
+ }
+ else
+ {
+ entries_before.insert(it, my);
+ no_before++;
+ }
+ }
+ }
+ }
+ // after
+ if (position <= 0)
+ i = 0;
+ else
+ i = position-1;
+ for ( ; i<num_entries; i++)
+ {
+ Z_Entry *ent = entries[i];
+
+ if (ent->which == Z_Entry_termInfo)
+ {
+ ScanTermInfo my;
+
+ Odr_int *occur = ent->u.termInfo->globalOccurrences;
+ my.m_count = occur ? *occur : 0;
+
+ if (ent->u.termInfo->term->which == Z_Term_general)
+ {
+ my.m_norm_term = std::string(
+ (const char *)
+ ent->u.termInfo->term->u.general->buf,
+ ent->u.termInfo->term->u.general->len);
+ }
+ if (my.m_norm_term.length())
+ {
+ ScanTermInfoList::iterator it =
+ entries_after.begin();
+ while (it != entries_after.end() && *it < my)
+ it++;
+ if (it != entries_after.end() && my == *it)
+ {
+ it->m_count += my.m_count;
+ }
+ else
+ {
+ entries_after.insert(it, my);
+ no_after++;
+ }
+ }
+ }
+ }
+
+ }