- /* Prime each buffer. */
- {
- int i;
-
- for (i = 0; i < n_runs; i++)
- if (run_index[i] == -2)
- {
- n_runs = i;
- break;
- }
- else
- {
- int j;
- int ofs = records_per_buffer * i;
-
- buffered[i] = min (records_per_buffer, run_length[i]);
- for (j = 0; j < buffered[i]; j++)
- if ((int) fread (x[j + ofs]->record, sizeof (union value),
- dict_get_value_cnt (default_dict), handle[i])
- != dict_get_value_cnt (default_dict))
- {
- sprintf (tmp_extname, "%08x", run_index[i]);
- if (ferror (handle[i]))
- msg (SE, _("%s: Error reading temporary file in merge: %s."),
- tmp_basename, strerror (errno));
- else
- msg (SE, _("%s: Unexpected end of temporary file in merge."),
- tmp_basename);
- goto lossage;
- }
- buffer_ptr[i] = ofs;
- run_length[i] -= buffered[i];
- }
- }
-
- /* Perform the merge proper. */
- while (n_runs) /* Loop while some data is left. */
- {
- int i;
- int min = 0;
-
- for (i = 1; i < n_runs; i++)
- if (compare_record (x[buffer_ptr[min]]->record,
- x[buffer_ptr[i]]->record) > 0)
- min = i;
-
- if ((int) fwrite (x[buffer_ptr[min]]->record, sizeof (union value),
- dict_get_value_cnt (default_dict),
- handle[N_INPUT_BUFFERS])
- != dict_get_value_cnt (default_dict))
- {
- sprintf (tmp_extname, "%08x", run_index[i]);
- msg (SE, _("%s: Error writing temporary file in "
- "merge: %s."), tmp_basename, strerror (errno));
- goto lossage;
- }
-
- /* Remove one case from the buffer for this input file. */
- if (--buffered[min] == 0)
- {
- /* The input buffer is empty. Do any cases remain in the
- initial run on disk? */
- if (run_length[min])
- {
- /* Yes. Read them in. */
-
- int j;
- int ofs;
-
- /* Reset the buffer pointer. Note that we can't simply
- set it to (i * records_per_buffer) since the run
- order might have changed. */
- ofs = buffer_ptr[min] -= buffer_ptr[min] % records_per_buffer;
-
- buffered[min] = min (records_per_buffer, run_length[min]);
- for (j = 0; j < buffered[min]; j++)
- if ((int) fread (x[j + ofs]->record, sizeof (union value),
- dict_get_value_cnt (default_dict),
- handle[min])
- != dict_get_value_cnt (default_dict))
- {
- sprintf (tmp_extname, "%08x", run_index[min]);
- if (ferror (handle[min]))
- msg (SE, _("%s: Error reading temporary file in "
- "merge: %s."),
- tmp_basename, strerror (errno));
- else
- msg (SE, _("%s: Unexpected end of temporary file "
- "in merge."),
- tmp_basename);
- goto lossage;
- }
- run_length[min] -= buffered[min];
- }
- else
- {
- /* No. Delete this run. */
-
- /* Close the file. */
- FILE *f = handle[min];
- handle[min] = NULL;
- sprintf (tmp_extname, "%08x", run_index[min]);
- if (fclose (f) == EOF)
- msg (SE, _("%s: Error closing temporary file in merge: "
- "%s."), tmp_basename, strerror (errno));
-
- /* Delete the file. */
- if (remove (tmp_basename) != 0)
- msg (SE, _("%s: Error removing temporary file in merge: "
- "%s."), tmp_basename, strerror (errno));
-
- n_runs--;
- if (min != n_runs)
- {
- /* Since this isn't the last run, we move the last
- run into its spot to force all the runs to be
- contiguous. */
- run_index[min] = run_index[n_runs];
- run_length[min] = run_length[n_runs];
- buffer_ptr[min] = buffer_ptr[n_runs];
- buffered[min] = buffered[n_runs];
- handle[min] = handle[n_runs];
- }
- }
- }
- else
- buffer_ptr[min]++;
- }
-
- /* Close output file. */
- {
- FILE *f = handle[N_INPUT_BUFFERS];
- handle[N_INPUT_BUFFERS] = NULL;
- if (fclose (f) == EOF)
- {
- sprintf (tmp_extname, "%08x", run_no);
- msg (SE, _("%s: Error closing temporary file in merge: "
- "%s."),
- tmp_basename, strerror (errno));
- return 0;
- }
- }
-
- return 1;