aboutsummaryrefslogtreecommitdiff
path: root/gcc/cobol/util.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/cobol/util.h')
-rw-r--r--gcc/cobol/util.h90
1 files changed, 84 insertions, 6 deletions
diff --git a/gcc/cobol/util.h b/gcc/cobol/util.h
index 20d735d..d07b669 100644
--- a/gcc/cobol/util.h
+++ b/gcc/cobol/util.h
@@ -31,11 +31,13 @@
#ifndef _UTIL_H_
#define _UTIL_H_
-void cbl_message(int fd, const char *format_string, ...);
-void cbl_internal_error(const char *format_string, ...);
+void cbl_message(int fd, const char *format_string, ...)
+ ATTRIBUTE_PRINTF_2;
+void cbl_internal_error(const char *format_string, ...)
+ ATTRIBUTE_GCOBOL_DIAG(1, 2);
-void cbl_err(const char *format_string, ...);
-void cbl_errx(const char *format_string, ...);
+void cbl_err(const char *format_string, ...) ATTRIBUTE_GCOBOL_DIAG(1, 2);
+void cbl_errx(const char *format_string, ...) ATTRIBUTE_GCOBOL_DIAG(1, 2);
bool fisdigit(int c);
bool fisspace(int c);
@@ -43,8 +45,84 @@ int ftolower(int c);
int ftoupper(int c);
bool fisprint(int c);
-const char * cobol_filename_restore();
-const char * cobol_lineno_save();
+void cobol_set_pp_option(int opt);
+void cobol_filename_restore();
+const char * cobol_lineno( int );
+int cobol_lineno();
+
+unsigned long gb4( size_t input );
+
+template <typename P>
+static inline const void *
+as_voidp( P p ) {
+ return static_cast<const void *>(p);
+}
+
+/*
+ * The default source format, whether free or fixed, is determined
+ * heuristically by examining the PROGRAM-ID line, if it exists, in the first
+ * input file. If that file does not have such a line, the default is free
+ * format. Else the format is set to fixed if anything appears on that line
+ * that would prohibit parsing it as free format,
+ */
+class source_format_t {
+ bool first_file, explicitly;
+ int left, right;
+public:
+ source_format_t()
+ : first_file(true), explicitly(false), left(0), right(0)
+ {}
+ void indicator_column_set( int column ) {
+ explicitly = true;
+ if( column == 0 ) right = 0;
+ if( column < 0 ) {
+ column = -column;
+ right = 73;
+ }
+ left = column;
+ }
+
+ bool inference_pending() {
+ bool tf = first_file && !explicitly;
+ first_file = false;
+ return tf;
+ }
+
+ void infer( const char *bol, bool want_reference_format );
+
+ inline bool is_fixed() const { return left == 7; }
+ inline bool is_reffmt() const { return is_fixed() && right == 73; }
+ inline bool is_free() const { return ! is_fixed(); }
+
+ const char * description() const {
+ if( is_reffmt() ) return "REFERENCE";
+ if( is_fixed() ) return "FIXED";
+ if( is_free() ) return "FREE";
+ gcc_unreachable();
+ }
+
+ inline int left_margin() {
+ return left == 0? left : left - 1;
+ }
+ inline int right_margin() {
+ return right == 0? right : right - 1;
+ }
+};
+
+
+void cdf_push();
+void cdf_push_call_convention();
+void cdf_push_current_tokens();
+void cdf_push_dictionary();
+void cdf_push_enabled_exceptions();
+void cdf_push_source_format();
+
+void cdf_pop();
+void cdf_pop_call_convention();
+void cdf_pop_current_tokens();
+void cdf_pop_dictionary();
+void cdf_pop_source_format();
+void cdf_pop_enabled_exceptions();
#endif