/* * Copyright (C) 2013 Intel Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ #include #include #include #include #include "history.h" /* Very simple history storage for easy usage of tool */ #define HISTORY_DEPTH 40 #define LINE_SIZE 200 static char lines[HISTORY_DEPTH][LINE_SIZE]; static int last_line = 0; static int history_size = 0; /* TODO: Storing history not implemented yet */ void history_store(const char *filename) { } /* Restoring history from file */ void history_restore(const char *filename) { char line[1000]; FILE *f = fopen(filename, "rt"); if (f == NULL) return; for (;;) { if (fgets(line, 1000, f) != NULL) { int l = strlen(line); while (l > 0 && isspace(line[--l])) line[l] = 0; if (l > 0) history_add_line(line); } else break; } fclose(f); } /* Add new line to history buffer */ void history_add_line(const char *line) { if (line == NULL || strlen(line) == 0) return; if (strcmp(line, lines[last_line]) == 0) return; last_line = (last_line + 1) % HISTORY_DEPTH; strncpy(&lines[last_line][0], line, LINE_SIZE - 1); if (history_size < HISTORY_DEPTH) history_size++; } /* * Get n-th line from history * 0 - means latest * -1 - means oldest * return -1 if there is no such line */ int history_get_line(int n, char *buf, int buf_size) { if (n == -1) n = history_size - 1; if (n >= history_size || buf_size == 0 || n < 0) return -1; strncpy(buf, &lines[(HISTORY_DEPTH + last_line - n) % HISTORY_DEPTH][0], buf_size - 1); buf[buf_size - 1] = 0; return n; }