diff options
author | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-06-08 17:11:01 +0300 |
---|---|---|
committer | Sergey Poznyakoff <gray@gnu.org.ua> | 2017-06-08 17:14:53 +0300 |
commit | 60db45be4fab2c7a4559605e5d1f483c5058bd05 (patch) | |
tree | 446cd2994b4a91d0c779d19b72b9f30199b0fe85 | |
parent | 3a441d83cb5322c9b2ed4f3ea5dd8f6e859aa528 (diff) | |
download | mailutils-60db45be4fab2c7a4559605e5d1f483c5058bd05.tar.gz mailutils-60db45be4fab2c7a4559605e5d1f483c5058bd05.tar.bz2 |
Rename mu_locus_tracker to mu_linetrack
-rw-r--r-- | include/mailutils/locus.h | 29 | ||||
-rw-r--r-- | libmailutils/locus/Makefile.am | 2 | ||||
-rw-r--r-- | libmailutils/locus/linetrack.c (renamed from libmailutils/locus/tracker.c) | 93 | ||||
-rw-r--r-- | libmailutils/tests/.gitignore | 2 | ||||
-rw-r--r-- | libmailutils/tests/Makefile.am | 4 | ||||
-rw-r--r-- | libmailutils/tests/linetrack.at (renamed from libmailutils/tests/loctrack.at) | 8 | ||||
-rw-r--r-- | libmailutils/tests/linetrack.c (renamed from libmailutils/tests/loctrack.c) | 10 | ||||
-rw-r--r-- | libmailutils/tests/testsuite.at | 2 |
8 files changed, 79 insertions, 71 deletions
diff --git a/include/mailutils/locus.h b/include/mailutils/locus.h index 66ba49b2b..229e14bc0 100644 --- a/include/mailutils/locus.h +++ b/include/mailutils/locus.h @@ -17,13 +17,14 @@ struct mu_locus_range struct mu_locus_point end; }; -typedef struct mu_locus_track *mu_locus_track_t; +typedef struct mu_linetrack *mu_linetrack_t; -struct mu_locus_track_stat +struct mu_linetrack_stat { - unsigned start_line; - size_t n_lines; - size_t n_chars; + unsigned start_line; /* Start line number (1-based) */ + size_t n_lines; /* Number of lines, including the recent (incomplete) + one */ + size_t n_chars; /* Total number of characters */ }; int mu_ident_ref (char const *name, char const **refname); @@ -47,17 +48,15 @@ mu_locus_point_same_line (struct mu_locus_point const *a, void mu_lrange_debug (struct mu_locus_range const *loc, char const *fmt, ...); -int mu_locus_track_create (mu_locus_track_t *ret, +int mu_linetrack_create (mu_linetrack_t *ret, char const *file_name, size_t max_lines); -void mu_locus_track_free (mu_locus_track_t trk); -void mu_locus_track_destroy (mu_locus_track_t *trk); -size_t mu_locus_track_level (mu_locus_track_t trk); -void mu_locus_tracker_advance (struct mu_locus_track *trk, - struct mu_locus_range *loc, - char const *text, size_t leng); -int mu_locus_tracker_retreat (struct mu_locus_track *trk, size_t n); -int mu_locus_tracker_stat (struct mu_locus_track *trk, - struct mu_locus_track_stat *st); +void mu_linetrack_free (mu_linetrack_t trk); +void mu_linetrack_destroy (mu_linetrack_t *trk); +void mu_linetrack_advance (mu_linetrack_t trk, + struct mu_locus_range *loc, + char const *text, size_t leng); +int mu_linetrack_retreat (mu_linetrack_t trk, size_t n); +int mu_linetrack_stat (mu_linetrack_t trk, struct mu_linetrack_stat *st); void mu_stream_print_locus_range (mu_stream_t stream, diff --git a/libmailutils/locus/Makefile.am b/libmailutils/locus/Makefile.am index 827fa8b35..5c46e2c7c 100644 --- a/libmailutils/locus/Makefile.am +++ b/libmailutils/locus/Makefile.am @@ -20,7 +20,7 @@ noinst_LTLIBRARIES = liblocus.la liblocus_la_SOURCES = \ ident.c\ debug.c\ - tracker.c + linetrack.c AM_CPPFLAGS = @MU_LIB_COMMON_INCLUDES@ -I/libmailutils diff --git a/libmailutils/locus/tracker.c b/libmailutils/locus/linetrack.c index a601a1f30..f6be064bb 100644 --- a/libmailutils/locus/tracker.c +++ b/libmailutils/locus/linetrack.c @@ -4,22 +4,36 @@ #include <mailutils/locus.h> #include <mailutils/error.h> -struct mu_locus_track +/* The line-tracker structure keeps track of the last N lines read from a + text input file. For each line read it keeps the number of characters + in that line including the newline. This information is stored in a + syclic stack of N elements. Top of stack always represents the current + line. For the purpose of line tracker, current line is the line that is + being visited, such that its final newline character has not yet been + seen. Once the newline is seen, the line is pushed on stack, and a new + current line is assumed. + + The value of N must not be less than 2. +*/ +struct mu_linetrack { - char const *file_name; /* Name of the source file */ - size_t max_lines; /* Max. number of lines history kept by tracker */ - size_t head; /* Bottom of stack */ - size_t level; /* Number of elements on stack */ - unsigned hline; /* Number of line corresponding to cols[head] */ - unsigned *cols; /* Cyclic stack */ + char const *file_name; /* Name of the source file */ + size_t max_lines; /* Max. number of lines history kept by tracker (N) */ + size_t head; /* Index of the eldest element on stack */ + size_t tos; /* Index of the most recent element on stack + (< max_lines) */ + unsigned hline; /* Number of line corresponding to cols[head] */ + unsigned *cols; /* Cyclic stack or character counts. + Number of characters in line (hline + n) is + cols[head + n] (0 <= n <= tos). */ }; int -mu_locus_track_create (mu_locus_track_t *ret, +mu_linetrack_create (mu_linetrack_t *ret, char const *file_name, size_t max_lines) { int rc; - struct mu_locus_track *trk; + struct mu_linetrack *trk; trk = malloc (sizeof *trk); if (!trk) @@ -43,7 +57,7 @@ mu_locus_track_create (mu_locus_track_t *ret, max_lines = 2; trk->max_lines = max_lines; trk->head = 0; - trk->level = 0; + trk->tos = 0; trk->hline = 1; trk->cols[0] = 0; @@ -52,7 +66,7 @@ mu_locus_track_create (mu_locus_track_t *ret, } void -mu_locus_track_free (mu_locus_track_t trk) +mu_linetrack_free (mu_linetrack_t trk) { if (trk) { @@ -63,54 +77,48 @@ mu_locus_track_free (mu_locus_track_t trk) } void -mu_locus_track_destroy (mu_locus_track_t *trk) +mu_linetrack_destroy (mu_linetrack_t *trk) { if (trk) { - mu_locus_track_free (*trk); + mu_linetrack_free (*trk); *trk = NULL; } } -size_t -mu_locus_track_level (mu_locus_track_t trk) -{ - return trk->level; -} - static inline unsigned * -cols_tos_ptr (mu_locus_track_t trk) +cols_tos_ptr (mu_linetrack_t trk) { - return &trk->cols[(trk->head + trk->level) % trk->max_lines]; + return &trk->cols[(trk->head + trk->tos) % trk->max_lines]; } static inline unsigned -cols_peek (mu_locus_track_t trk, size_t n) +cols_peek (mu_linetrack_t trk, size_t n) { return trk->cols[(trk->head + n) % trk->max_lines]; } static inline unsigned * -push (mu_locus_track_t trk) +push (mu_linetrack_t trk) { unsigned *ptr; - if (trk->level == trk->max_lines) + if (trk->tos == trk->max_lines - 1) { trk->head++; trk->hline++; } else - trk->level++; + trk->tos++; *(ptr = cols_tos_ptr (trk)) = 0; return ptr; } static inline unsigned * -pop (mu_locus_track_t trk) +pop (mu_linetrack_t trk) { - if (trk->level == 0) + if (trk->tos == 0) return NULL; - trk->level--; + trk->tos--; return cols_tos_ptr (trk); } @@ -119,12 +127,11 @@ pop (mu_locus_track_t trk) #endif int -mu_locus_tracker_stat (struct mu_locus_track *trk, - struct mu_locus_track_stat *st) +mu_linetrack_stat (struct mu_linetrack *trk, struct mu_linetrack_stat *st) { size_t i, nch = 0; - for (i = 0; i <= trk->level; i++) + for (i = 0; i <= trk->tos; i++) { unsigned n = cols_peek (trk, i); if (SIZE_MAX - nch < n) @@ -133,14 +140,16 @@ mu_locus_tracker_stat (struct mu_locus_track *trk, } st->start_line = trk->hline; - st->n_lines = trk->level; + st->n_lines = trk->tos + 1; st->n_chars = nch; + + return 0; } void -mu_locus_tracker_advance (struct mu_locus_track *trk, - struct mu_locus_range *loc, - char const *text, size_t leng) +mu_linetrack_advance (struct mu_linetrack *trk, + struct mu_locus_range *loc, + char const *text, size_t leng) { unsigned *ptr; @@ -148,7 +157,7 @@ mu_locus_tracker_advance (struct mu_locus_track *trk, return; loc->beg.mu_file = loc->end.mu_file = trk->file_name; - loc->beg.mu_line = trk->hline + trk->level; + loc->beg.mu_line = trk->hline + trk->tos; ptr = cols_tos_ptr (trk); loc->beg.mu_col = *ptr + 1; while (leng--) @@ -160,14 +169,14 @@ mu_locus_tracker_advance (struct mu_locus_track *trk, } if (*ptr) { - loc->end.mu_line = trk->hline + trk->level; + loc->end.mu_line = trk->hline + trk->tos; loc->end.mu_col = *ptr; } else { /* Text ends with a newline. Keep the previos line number. */ - loc->end.mu_line = trk->hline + trk->level - 1; - loc->end.mu_col = cols_peek (trk, trk->level - 1) - 1; + loc->end.mu_line = trk->hline + trk->tos - 1; + loc->end.mu_col = cols_peek (trk, trk->tos - 1) - 1; if (loc->end.mu_col + 1 == loc->beg.mu_col) { /* This happens if the previous line contained only newline. */ @@ -177,11 +186,11 @@ mu_locus_tracker_advance (struct mu_locus_track *trk, } int -mu_locus_tracker_retreat (struct mu_locus_track *trk, size_t n) +mu_linetrack_retreat (struct mu_linetrack *trk, size_t n) { - struct mu_locus_track_stat st; + struct mu_linetrack_stat st; - mu_locus_tracker_stat (trk, &st); + mu_linetrack_stat (trk, &st); if (n > st.n_chars) return ERANGE; else diff --git a/libmailutils/tests/.gitignore b/libmailutils/tests/.gitignore index 1b414e3d6..f0c34b9d5 100644 --- a/libmailutils/tests/.gitignore +++ b/libmailutils/tests/.gitignore @@ -19,7 +19,7 @@ fsfolder globtest imapio listop -loctrack +linetrack logstr mailcap mimehdr diff --git a/libmailutils/tests/Makefile.am b/libmailutils/tests/Makefile.am index 2b2542c54..be698c85c 100644 --- a/libmailutils/tests/Makefile.am +++ b/libmailutils/tests/Makefile.am @@ -54,7 +54,7 @@ noinst_PROGRAMS = \ globtest\ imapio\ listop\ - loctrack\ + linetrack\ logstr\ mailcap\ mimehdr\ @@ -107,7 +107,7 @@ TESTSUITE_AT = \ inline-comment.at\ linecon.at\ list.at\ - loctrack.at\ + linetrack.at\ logstr.at\ mailcap.at\ mimehdr.at\ diff --git a/libmailutils/tests/loctrack.at b/libmailutils/tests/linetrack.at index e96582e54..6f01b4d83 100644 --- a/libmailutils/tests/loctrack.at +++ b/libmailutils/tests/linetrack.at @@ -14,12 +14,12 @@ # You should have received a copy of the GNU General Public License # along with GNU Mailutils. If not, see <http://www.gnu.org/licenses/>. -AT_BANNER([Locus tracker]) +AT_BANNER([Line tracker]) m4_pushdef([TRACKTEST],[ AT_SETUP([$1]) AT_KEYWORDS([tracker $2]) -AT_CHECK([loctrack liber $3 <<EOT +AT_CHECK([linetrack liber $3 <<EOT $4[]EOT ], [0], @@ -103,7 +103,7 @@ three liber:2.1-3: two\n liber:3.1-5: three ], -[loctrack: retreat count too big +[linetrack: retreat count too big ]) -m4_popdef([TRACKTEST])
\ No newline at end of file +m4_popdef([TRACKTEST]) diff --git a/libmailutils/tests/loctrack.c b/libmailutils/tests/linetrack.c index 354280354..cf5501b0a 100644 --- a/libmailutils/tests/loctrack.c +++ b/libmailutils/tests/linetrack.c @@ -6,7 +6,7 @@ main (int argc, char **argv) { unsigned long max_lines; char *end; - mu_locus_track_t trk; + mu_linetrack_t trk; int rc; char *buf = NULL; size_t size, n; @@ -26,7 +26,7 @@ main (int argc, char **argv) return 1; } - MU_ASSERT (mu_locus_track_create (&trk, argv[1], max_lines)); + MU_ASSERT (mu_linetrack_create (&trk, argv[1], max_lines)); while ((rc = mu_stream_getline (mu_strin, &buf, &size, &n)) == 0 && n > 0) { struct mu_locus_range lr; @@ -43,17 +43,17 @@ main (int argc, char **argv) mu_error ("bad number"); continue; } - rc = mu_locus_tracker_retreat (trk, x); + rc = mu_linetrack_retreat (trk, x); if (rc == ERANGE) mu_error ("retreat count too big"); else if (rc) - mu_diag_funcall (MU_DIAG_ERROR, "mu_locus_tracker_retreat", buf+2, + mu_diag_funcall (MU_DIAG_ERROR, "mu_linetrack_retreat", buf+2, rc); } else { mu_c_str_unescape (buf, "\\\n", "\\n", &tok); - mu_locus_tracker_advance (trk, &lr, tok, strlen (tok)); + mu_linetrack_advance (trk, &lr, tok, strlen (tok)); free (tok); mu_stream_lprintf (mu_strout, &lr, "%s\n", buf); } diff --git a/libmailutils/tests/testsuite.at b/libmailutils/tests/testsuite.at index 9518cd749..3b1759de2 100644 --- a/libmailutils/tests/testsuite.at +++ b/libmailutils/tests/testsuite.at @@ -212,4 +212,4 @@ m4_include([msgset.at]) m4_include([globtest.at]) -m4_include([loctrack.at]) +m4_include([linetrack.at]) |