00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #ifndef CU_SREF_H
00025 #define CU_SREF_H
00026
00027 #include <stdio.h>
00028 #include <cu/location.h>
00029
00030 CU_BEGIN_DECLARATIONS
00031
00032 #define cu_sref cu_location
00033 void cu_sref_init(cu_sref_t, cu_str_t path, int line, int column);
00034 cu_sref_t cu_sref_new(cu_str_t path, int line, int column);
00035 cu_sref_t cu_sref_new_cstr(char const *path, int line, int column);
00036 void cu_sref_init_range(cu_sref_t, cu_str_t path,
00037 int first_line, int first_column,
00038 int last_line, int last_column);
00039 cu_sref_t cu_sref_new_range(cu_str_t path,
00040 int first_line, int first_column,
00041 int last_line, int last_column);
00042 void cu_sref_init_span(cu_sref_t, cu_sref_t first, cu_sref_t last);
00043 cu_sref_t cu_sref_new_span(cu_sref_t first, cu_sref_t last);
00044 void cu_sref_init_first(cu_sref_t srf, cu_sref_t src);
00045 void cu_sref_init_last(cu_sref_t srf, cu_sref_t src);
00046 void cu_sref_set_sref_first(cu_sref_t srf, cu_sref_t first);
00047 void cu_sref_set_sref_last(cu_sref_t srf, cu_sref_t last);
00048 cu_bool_t cu_sref_compatible(cu_sref_t srf0, cu_sref_t srf1);
00049 CU_SINLINE cu_bool_t cu_sref_is_point(cu_sref_t srf)
00050 { return srf->lbline == srf->ubline && srf->lbcol == srf->ubcol; }
00051 CU_SINLINE cu_bool_t cu_sref_is_range(cu_sref_t srf)
00052 { return !cu_sref_is_point(srf); }
00053 CU_SINLINE void
00054 cu_sref_set_chain_tail(cu_sref_t head, cu_sref_t chain_tail)
00055 { head->chain_tail = chain_tail; }
00056 CU_SINLINE cu_sref_t
00057 cu_sref_chain_tail(cu_sref_t srf) { return srf->chain_tail; }
00058 void cu_sref_set_tabstop(cu_sref_t, int w);
00059 CU_SINLINE cu_sref_t
00060 cu_sref_unknown(void) { return NULL; }
00061 CU_SINLINE int
00062 cu_sref_is_known(cu_sref_t srf) { return srf != NULL; }
00063 void cu_sref_init_copy(cu_sref_t srf, cu_sref_t srf0);
00064 cu_sref_t cu_sref_new_copy(cu_sref_t);
00065 CU_SINLINE cu_str_t
00066 cu_sref_path(cu_sref_t srf) { return srf->origin->path; }
00067 CU_SINLINE int
00068 cu_sref_is_stdin(cu_sref_t srf) { return srf->origin->path == NULL; }
00069 CU_SINLINE int
00070 cu_sref_line(cu_sref_t srf) { return srf->lbline; }
00071 CU_SINLINE int
00072 cu_sref_column(cu_sref_t srf) { return srf->lbcol; }
00073 CU_SINLINE void
00074 cu_sref_next(cu_sref_t srf) { srf->ubcol = ++srf->lbcol; }
00075 void cu_sref_tab(cu_sref_t);
00076 void cu_sref_newline(cu_sref_t);
00077 CU_SINLINE void
00078 cu_sref_advance_char(cu_sref_t srf, char ch)
00079 {
00080 switch (ch) {
00081 case '\n': cu_sref_newline(srf); break;
00082 case '\t': cu_sref_tab(srf); break;
00083 default: if ((unsigned char)ch <= 127) cu_sref_next(srf); break;
00084 }
00085 }
00086 void cu_sref_advance_columns(cu_sref_t sref, int cnt);
00087 #define cu_sref_fprint cu_location_fprint
00088
00089 #define cu_sref_cct cu_sref_init
00090
00091 #define cu_sref_cct_range cu_sref_init_range
00092
00093 #define cu_sref_cct_sref_range cu_sref_init_span
00094
00095 #define cu_sref_cct_sref_first cu_sref_init_first
00096
00097 #define cu_sref_cct_sref_last cu_sref_init_last
00098
00099 #define cu_sref_cct_copy cu_sref_init_copy
00100
00101 #define cu_sref_new_sref_range cu_sref_new_span
00102
00103 CU_END_DECLARATIONS
00104 #endif