ARB
aisc_location.h
Go to the documentation of this file.
1 // Coded by Ralf Westram (coder@reallysoft.de) in March 2011 //
2 // Institute of Microbiology (Technical University Munich) //
3 // http://www.arb-home.de/ //
4 
5 #ifndef AISC_LOCATION_H
6 #define AISC_LOCATION_H
7 
8 #ifndef DUPSTR_H
9 #include <dupstr.h>
10 #endif
11 
12 class Location {
13  int linenr;
14  char *path;
15 
16  void print_internal(const char *msg, const char *msg_type, const char *launcher_file, int launcher_line) const;
17 
18  void fprint_location(const char *file, int line, FILE *fp) const {
19  fprintf(fp, "%s:%i: ", file, line);
20  }
21  void fprint_location(FILE *fp) const {
22  fprint_location(path, linenr, fp);
23  }
24 
25  static Location exit_pc;
26  static int global_error_count;
27 
28 public:
29 
30  Location() : linenr(-666), path(NULp) {}
31  Location(int linenr_, const char *path_)
32  : linenr(linenr_), path(strdup(path_)) { }
33  Location(const Location& other)
34  : linenr(other.linenr), path(strdup(other.path)) { }
35  Location& operator=(const Location& other) {
36  linenr = other.linenr;
37  freedup(path, other.path);
38  return *this;
39  }
40  ~Location() { free(path); }
41 
42  bool valid() const { return path != NULp; }
43 
44  const char *get_path() const { return path; }
45  int get_linenr() const { return linenr; }
46 
47  void print_error_internal(const char *err, const char *launcher_file, int launcher_line) const {
48  print_internal(err, "Error", launcher_file, launcher_line);
49  global_error_count++;
50  }
51  void print_warning_internal(const char *msg, const char *launcher_file, int launcher_line) const {
52  print_internal(msg, "Warning", launcher_file, launcher_line);
53  }
54  void start_message(const char *prefix) const {
55  print_internal(NULp, prefix, NULp, 0);
56  }
57 
58  static const Location& guess_pc();
59  static void announce_exit_pc(const Location& exitingHere) { exit_pc = exitingHere; }
60 
61  static int get_error_count() { return global_error_count; }
62 
64  aisc_assert(valid());
65  linenr++;
66  return *this;
67  }
68  bool operator == (const Location& other) const {
69  if (!valid()) return !other.valid();
70  return linenr == other.linenr && strcmp(path, other.path) == 0;
71  }
72  bool operator != (const Location& other) const { return !(*this == other); }
73 };
74 
75 #else
76 #error aisc_location.h included twice
77 #endif // AISC_LOCATION_H
const char * get_path() const
Definition: aisc_location.h:44
Location(int linenr_, const char *path_)
Definition: aisc_location.h:31
bool valid() const
Definition: aisc_location.h:42
Location & operator=(const Location &other)
Definition: aisc_location.h:35
bool operator!=(const Location &other) const
Definition: aisc_location.h:72
void print_warning_internal(const char *msg, const char *launcher_file, int launcher_line) const
Definition: aisc_location.h:51
static int get_error_count()
Definition: aisc_location.h:61
bool operator==(const Location &other) const
Definition: aisc_location.h:68
static void announce_exit_pc(const Location &exitingHere)
Definition: aisc_location.h:59
Location & operator++()
Definition: aisc_location.h:63
static const Location & guess_pc()
Definition: aisc_commands.c:17
Location(const Location &other)
Definition: aisc_location.h:33
static int line
Definition: arb_a2ps.c:296
#define NULp
Definition: cxxforward.h:97
void start_message(const char *prefix) const
Definition: aisc_location.h:54
int get_linenr() const
Definition: aisc_location.h:45
#define aisc_assert(cond)
Definition: aisc_def.h:11
void print_error_internal(const char *err, const char *launcher_file, int launcher_line) const
Definition: aisc_location.h:47