/* * Line attribute cache * Copyright * (C) 2006 Joseph H. Allen * * This file is part of JOE (Joe's Own Editor) */ struct lattr_db { struct lattr_db *next; /* Linked list of attribute databases owned by a B */ struct high_syntax *syn; /* This database is for this syntax */ B *b; /* This database is for this buffer */ /* Use a gap buffer for the attribute records */ HIGHLIGHT_STATE *buffer; /* Address of buffer */ ptrdiff_t hole; /* Offset to hole */ ptrdiff_t ehole; /* Offset to end of hole */ ptrdiff_t end; /* Malloc() size of buffer */ ptrdiff_t first_invalid; /* Lines beginning with this are invalid */ ptrdiff_t invalid_window; /* Lines beyond first_invalid+invalid_window might be valid */ /* -1 means all lines are valid */ }; struct lattr_db *mk_lattr_db(B *new_b, struct high_syntax *new_syn); /* Create database structure */ void rm_lattr_db(struct lattr_db *db); /* Delete database structure */ void rm_all_lattr_db(struct lattr_db *db); /* Delete linked-list of databases */ void reset_all_lattr_db(struct lattr_db *db); /* Delete linked-list of databases */ struct lattr_db *find_lattr_db(B *b, struct high_syntax *y); /* Find database for a particular syntax. If one doesn't exist, create it and add it to the list for the B */ void drop_lattr_db(B *b, struct lattr_db *db); /* Drop a database if it's no longer needed. This checks through all BWs on a B to see if any of them refer to db. If none, the db is dropped. */ #define lattr_size(db) ((db)->end - ((db)->ehole - (db)->hole)) void lattr_hole(struct lattr_db *db, ptrdiff_t pos); /* Set hole position */ void lattr_check(struct lattr_db *db, ptrdiff_t size); /* Make sure we have enough space for insert. If not, expand buffer. */ void lattr_ins(struct lattr_db *db,ptrdiff_t line,ptrdiff_t size); /* An insert occured, beginning on specified line. 'size' lines were inserted. Adjust invalid window to cover inserted area. */ void lattr_del(struct lattr_db *db,ptrdiff_t line,ptrdiff_t size); /* A deletion occured, beginning on specified line. 'size' lines were deleted. Adjust invalid window to cover deleted area. */ HIGHLIGHT_STATE lattr_get(struct lattr_db *db,struct high_syntax *y,P *p,ptrdiff_t line); /* Get state for specified line. If we don't have it, compute it. Records results of any computation so that we don't have to do it again. If first_invalid is < number of lines we have, compute forward until we start matching again as this is a very common case. */ #define lattr_lvalue(db, line) ((line) >= (db)->hole ? (db)->buffer[(line) - (db)->hole + (db)->ehole] : (db)->buffer[line])