aboutsummaryrefslogtreecommitdiff
path: root/gcc/cobol/util.h
blob: d07b669a7f4804141dec658623e05c20d56710bb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
/*
 * Copyright (c) 2021-2025 Symas Corporation
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are
 * met:
 *
 * * Redistributions of source code must retain the above copyright
 *   notice, this list of conditions and the following disclaimer.
 * * Redistributions in binary form must reproduce the above
 *   copyright notice, this list of conditions and the following disclaimer
 *   in the documentation and/or other materials provided with the
 *   distribution.
 * * Neither the name of the Symas Corporation nor the names of its
 *   contributors may be used to endorse or promote products derived from
 *   this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

#ifndef _UTIL_H_
#define _UTIL_H_

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, ...) 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);
int  ftolower(int c);
int  ftoupper(int c);
bool fisprint(int c);

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