edit_book_mark_t * book_mark_find (WEdit * edit, long line) { edit_book_mark_t *p; if (edit->book_mark == NULL) { /* must have an imaginary top bookmark at line -1 to make things less complicated */ edit->book_mark = g_new0 (edit_book_mark_t, 1); edit->book_mark->line = -1; return edit->book_mark; } for (p = edit->book_mark; p != NULL; p = p->next) { if (p->line > line) break; /* gone past it going downward */ if (p->next != NULL) { if (p->next->line > line) { edit->book_mark = p; return double_marks (edit, p); } } else { edit->book_mark = p; return double_marks (edit, p); } } for (p = edit->book_mark; p != NULL; p = p->prev) { if (p->next != NULL && p->next->line <= line) break; /* gone past it going upward */ if (p->line <= line) { if (p->next != NULL) { if (p->next->line > line) { edit->book_mark = p; return double_marks (edit, p); } } else { edit->book_mark = p; return double_marks (edit, p); } } } return NULL; /* can't get here */ }
/* returns the first bookmark on or before this line */ struct _book_mark *book_mark_find (WEdit * edit, int line) { struct _book_mark *p; if (!edit->book_mark) { /* must have an imaginary top bookmark at line -1 to make things less complicated */ edit->book_mark = g_malloc0 (sizeof (struct _book_mark)); edit->book_mark->line = -1; return edit->book_mark; } for (p = edit->book_mark; p; p = p->next) { if (p->line > line) break; /* gone past it going downward */ if (p->line <= line) { if (p->next) { if (p->next->line > line) { edit->book_mark = p; return double_marks (edit, p); } } else { edit->book_mark = p; return double_marks (edit, p); } } } for (p = edit->book_mark; p; p = p->prev) { if (p->next) if (p->next->line <= line) break; /* gone past it going upward */ if (p->line <= line) { if (p->next) { if (p->next->line > line) { edit->book_mark = p; return double_marks (edit, p); } } else { edit->book_mark = p; return double_marks (edit, p); } } } return 0; /* can't get here */ }