Changes in history.c [d4927a7:2bc6bb16]
Legend:
- Unmodified
- Added
- Removed
-
history.c
rd4927a7 r2bc6bb16 3 3 void owl_history_init(owl_history *h) 4 4 { 5 owl_list_create(&(h->hist)); 6 h->cur=0; /* current position in history */ 7 h->touched=0; /* whether we've gone into history */ 8 h->partial=0; /* is the 0th element is partially composed? */ 9 h->repeats=1; /* by default we'll allow repeat entries */ 10 } 11 12 void owl_history_set_norepeats(owl_history *h) 13 { 14 h->repeats=0; 5 g_queue_init(&h->hist); 6 h->cur = h->hist.tail; /* current position in history */ 7 h->partial = false; /* is the 0th element is partially composed? */ 15 8 } 16 9 17 10 const char *owl_history_get_prev(owl_history *h) 18 11 { 12 if (!h) return NULL; 19 13 20 if (!h) return NULL; 21 h->touched=1; 14 if (h->cur == NULL || g_list_previous(h->cur) == NULL) return NULL; 22 15 23 if (owl_list_get_size(&(h->hist))==0) return(NULL); 24 25 if (h->cur == owl_list_get_size(&(h->hist))-1) { 26 return(NULL); 27 } 28 29 h->cur++; 30 31 return(owl_list_get_element(&(h->hist), h->cur)); 16 h->cur = g_list_previous(h->cur); 17 return h->cur->data; 32 18 } 33 19 … … 35 21 { 36 22 if (!h) return NULL; 37 if (owl_list_get_size(&(h->hist))==0) return(NULL);38 if (h->cur==0) {39 return(NULL);40 }41 23 42 h->cur--; 43 return(owl_list_get_element(&(h->hist), h->cur)); 24 if (h->cur == NULL || g_list_next(h->cur) == NULL) return NULL; 25 26 h->cur = g_list_next(h->cur); 27 return h->cur->data; 44 28 } 45 29 46 void owl_history_store(owl_history *h, const char *line )30 void owl_history_store(owl_history *h, const char *line, bool partial) 47 31 { 48 i nt size;32 if (!h) return; 49 33 50 if (!h) return; 51 size=owl_list_get_size(&(h->hist)); 34 owl_history_reset(h); 52 35 53 /* if partial is set, remove the first entry first */ 54 if (h->partial) { 55 g_free(owl_list_get_element(&(h->hist), 0)); 56 owl_list_remove_element(&(h->hist), 0); 57 } 58 59 /* if repeats are disallowed, check if the line is the same as the last */ 60 if (owl_list_get_size(&(h->hist))>0) { 61 if (!strcmp(line, owl_list_get_element(&(h->hist), 0))) return; 62 } 36 /* check if the line is the same as the last */ 37 if (!partial && !g_queue_is_empty(&h->hist) && 38 strcmp(line, g_queue_peek_tail(&h->hist)) == 0) 39 return; 63 40 64 41 /* if we've reached the max history size, pop off the last element */ 65 if (size>OWL_HISTORYSIZE) { 66 g_free(owl_list_get_element(&(h->hist), size-1)); 67 owl_list_remove_element(&(h->hist), size-1); 68 } 42 if (g_queue_get_length(&h->hist) > OWL_HISTORYSIZE) 43 g_free(g_queue_pop_head(&h->hist)); 69 44 70 45 /* add the new line */ 71 owl_list_prepend_element(&(h->hist), g_strdup(line)); 72 } 73 74 void owl_history_set_partial(owl_history *h) 75 { 76 if (!h) return; 77 h->partial=1; 46 g_queue_push_tail(&h->hist, g_strdup(line)); 47 h->partial = partial; 48 h->cur = h->hist.tail; 78 49 } 79 50 … … 81 52 { 82 53 if (!h) return; 83 h->cur=0; 84 h->touched=0; 85 h->partial=0; 54 55 /* if partial is set, remove the first entry first */ 56 if (h->partial) { 57 g_free(g_queue_pop_tail(&h->hist)); 58 h->partial = false; 59 } 60 61 h->cur = h->hist.tail; 86 62 } 87 63 … … 89 65 { 90 66 if (!h) return(0); 91 if (h->touched) return(1); 92 return(0); 67 return h->cur != NULL && g_list_next(h->cur) != NULL; 93 68 }
Note: See TracChangeset
for help on using the changeset viewer.