+ nb_history = 0;
+ for(i=0;i<=NB_HISTORY;i++) {
+ info->history[i].level = -2;
+ }
+
+ for(rc = -2; (line = agets(infof)) != NULL; free(line)) {
+ history_t onehistory; /* one history record */
+ time_t date;
+ time_t *date_p = &date;
+ time_t *secs_p;
+
+ if (line[0] == '\0')
+ continue;
+ date = 0L;
+ if(line[0] == '/' && line[1] == '/') {
+ info->history[nb_history].level = -2;
+ rc = 0;
+ amfree(line);
+ return 0; /* normal end of record */
+ }
+
+ memset(&onehistory, 0, SIZEOF(onehistory));
+
+ s = line;
+ ch = *s++;
+
+#define sc "history:"
+ if(strncmp(line, sc, SIZEOF(sc)-1) != 0) {
+ amfree(line);
+ break;
+ }
+ s += SIZEOF(sc)-1;
+ ch = s[-1];
+#undef sc
+
+ skip_whitespace(s, ch);
+ if(ch == '\0' || sscanf((s - 1), "%d", &onehistory.level) != 1) {
+ amfree(line);
+ break;
+ }
+ skip_integer(s, ch);
+
+ skip_whitespace(s, ch);
+ if(ch == '\0' || sscanf((s - 1), OFF_T_FMT,
+ (OFF_T_FMT_TYPE *)&onehistory.size) != 1) {
+ amfree(line);
+ break;
+ }
+ skip_integer(s, ch);
+
+ skip_whitespace(s, ch);
+ if(ch == '\0' || sscanf((s - 1), OFF_T_FMT,
+ (OFF_T_FMT_TYPE *)&onehistory.csize) != 1) {
+ amfree(line);
+ break;
+ }
+ skip_integer(s, ch);
+
+ skip_whitespace(s, ch);
+ if(ch == '\0' || sscanf((s - 1), TIME_T_FMT,
+ (TIME_T_FMT_TYPE *)date_p) != 1) {
+ amfree(line);
+ break;
+ }
+ skip_integer(s, ch);
+
+ onehistory.date = date; /* time_t not guaranteed to be long */
+
+ onehistory.secs = (unsigned long)-1;
+ skip_whitespace(s, ch);
+ secs_p = &onehistory.secs;
+ if(ch != '\0') {
+ if(sscanf((s - 1), TIME_T_FMT,
+ (TIME_T_FMT_TYPE *)secs_p) != 1) {
+ amfree(line);
+ break;
+ }
+ skip_integer(s, ch);
+ }
+
+ info->history[nb_history++] = onehistory;
+ }
+ amfree(line);
+
+ while ((line = agets(infof)) != NULL) {
+ if (line[0] != '\0')
+ break;
+ amfree(line);
+ }
+ if (line == NULL) return -1;