w32tex
About: TeX Live provides a comprehensive TeX system including all the major TeX-related programs, macro packages, and fonts that are free software. Windows sources.
  Fossies Dox: w32tex-src.tar.xz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

Main.h
Go to the documentation of this file.
1 /* GRAPHITE2 LICENSING
2 
3  Copyright 2010, SIL International
4  All rights reserved.
5 
6  This library is free software; you can redistribute it and/or modify
7  it under the terms of the GNU Lesser General Public License as published
8  by the Free Software Foundation; either version 2.1 of License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  Lesser General Public License for more details.
15 
16  You should also have received a copy of the GNU Lesser General Public
17  License along with this library in the file named "LICENSE".
18  If not, write to the Free Software Foundation, 51 Franklin Street,
19  Suite 500, Boston, MA 02110-1335, USA or visit their web page on the
20  internet at http://www.fsf.org/licenses/lgpl.html.
21 
22 Alternatively, the contents of this file may be used under the terms of the
23 Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public
24 License, as published by the Free Software Foundation, either version 2
25 of the License or (at your option) any later version.
26 */
27 #pragma once
28 
29 #include <cstdlib>
30 #include "graphite2/Types.h"
31 
32 #ifdef GRAPHITE2_CUSTOM_HEADER
33 #include GRAPHITE2_CUSTOM_HEADER
34 #endif
35 
36 namespace graphite2 {
37 
38 typedef gr_uint8 uint8;
39 typedef gr_uint8 byte;
40 typedef gr_uint16 uint16;
41 typedef gr_uint32 uint32;
42 typedef gr_int8 int8;
43 typedef gr_int16 int16;
44 typedef gr_int32 int32;
45 typedef size_t uintptr;
46 
47 #ifdef GRAPHITE2_TELEMETRY
48 struct telemetry
49 {
50  class category;
51 
52  static size_t * _category;
53  static void set_category(size_t & t) throw() { _category = &t; }
54  static void stop() throw() { _category = 0; }
55  static void count_bytes(size_t n) throw() { if (_category) *_category += n; }
56 
57  size_t misc,
58  silf,
59  glyph,
60  code,
61  states,
62  starts,
63  transitions;
64 
65  telemetry() : misc(0), silf(0), glyph(0), code(0), states(0), starts(0), transitions(0) {}
66 };
67 
68 class telemetry::category
69 {
70  size_t * _prev;
71 public:
72  category(size_t & t) : _prev(_category) { _category = &t; }
73  ~~category() { _category = _prev; }
74 };
75 
76 #else
77 struct telemetry {};
78 #endif
79 
80 // Checked multiplaction to catch overflow or underflow when allocating memory
81 #if defined(__has_builtin)
82  #if __has_builtin(__builtin_mul_overflow)
83  #define HAVE_BUILTIN_OVERFLOW
84  #endif
85 #elif defined(__GNUC__) && (__GNUC__ >= 5) && !defined(__INTEL_COMPILER)
86  #define HAVE_BUILTIN_OVERFLOW
87 #endif
88 #if defined(__has_include)
89  #if __has_include(<intsafe.h>) && !defined(__CYGWIN__)
90  #define HAVE_INTSAFE_H
91  #endif
92 #elif defined(_WIN32)
93  #define HAVE_INTSAFE_H
94 #endif
95 
96 // Need to import intsafe into the top level namespace
97 #if defined(HAVE_INTSAFE_H)
98 } // namespace graphite2
99 
100 #include <intsafe.h>
101 
102 namespace graphite2 {
103 #endif
104 
105 #if defined(HAVE_BUILTIN_OVERFLOW)
106 inline
107 bool checked_mul(const size_t a, const size_t b, size_t & t) {
108  return __builtin_mul_overflow(a, b, &t);
109 }
110 #elif defined(HAVE_INTSAFE_H)
111 inline
112 bool checked_mul(const size_t a, const size_t b, size_t & t) {
113  return SizeTMult(a, b, &t) == INTSAFE_E_ARITHMETIC_OVERFLOW;
114 }
115 #else
116 inline
117 bool checked_mul(const size_t a, const size_t b, size_t & t) {
118  t = a*b;
119  return (((a | b) & (~size_t(0) << (sizeof(size_t) << 2))) && (t / a != b));
120 }
121 #endif
122 
123 // typesafe wrapper around malloc for simple types
124 // use free(pointer) to deallocate
125 
126 template <typename T> T * gralloc(size_t n)
127 {
128  size_t total;
129  if (checked_mul(n, sizeof(T), total))
130  return 0;
131 #ifdef GRAPHITE2_TELEMETRY
132  telemetry::count_bytes(total);
133 #endif
134  return static_cast<T*>(malloc(total));
135 }
136 
137 template <typename T> T * grzeroalloc(size_t n)
138 {
139 #ifdef GRAPHITE2_TELEMETRY
140  telemetry::count_bytes(sizeof(T) * n);
141 #endif
142  return static_cast<T*>(calloc(n, sizeof(T)));
143 }
144 
145 template <typename T>
146 inline T min(const T a, const T b)
147 {
148  return a < b ? a : b;
149 }
150 
151 template <typename T>
152 inline T max(const T a, const T b)
153 {
154  return a > b ? a : b;
155 }
156 
157 } // namespace graphite2
158 
159 #define CLASS_NEW_DELETE \
160  void * operator new (size_t size){ return gralloc<byte>(size);} \
161  void * operator new (size_t, void * p) throw() { return p; } \
162  void * operator new[] (size_t size) {return gralloc<byte>(size);} \
163  void * operator new[] (size_t, void * p) throw() { return p; } \
164  void operator delete (void * p) throw() { free(p);} \
165  void operator delete (void *, void *) throw() {} \
166  void operator delete[] (void * p)throw() { free(p); } \
167  void operator delete[] (void *, void *) throw() {}
168 
169 #if defined(__GNUC__) || defined(__clang__)
170 #define GR_MAYBE_UNUSED __attribute__((unused))
171 #else
172 #define GR_MAYBE_UNUSED
173 #endif
174 
175 #ifndef __has_cpp_attribute
176 # define __has_cpp_attribute(x) 0
177 #endif
178 
179 #if __has_cpp_attribute(clang::fallthrough)
180 # define GR_FALLTHROUGH [[clang::fallthrough]]
181 #elif __has_cpp_attribute(gnu::fallthrough)
182 # define GR_FALLTHROUGH [[gnu::fallthrough]]
183 #elif defined(_MSC_VER)
184  /*
185  * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis):
186  * https://msdn.microsoft.com/en-us/library/ms235402%28VS.80%29.aspx
187  */
188  #include <sal.h>
189  #define GR_FALLTHROUGH __fallthrough
190 #elif __GNUC__ >= 7
191  #define GR_FALLTHROUGH __attribute__ ((fallthrough))
192 #else
193  #define GR_FALLTHROUGH /* fallthrough */
194 #endif
195 
196 #ifdef _MSC_VER
197 #pragma warning(disable: 4800)
198 #pragma warning(disable: 4355)
199 #endif
int code
Definition: aftopl.c:52
#define stop
Definition: aptex-macros.h:362
#define n
Definition: t4ht.c:1290
#define b
Definition: jpegint.h:372
#define T
Definition: fmt.h:20
#define t
Definition: afcover.h:96
#define a(n)
Definition: gpos-common.c:148
voidp calloc()
#define malloc
Definition: alloca.c:91
Definition: bits.h:30
T * grzeroalloc(size_t n)
Definition: Main.h:137
gr_int16 int16
Definition: Main.h:43
T min(const T a, const T b)
Definition: Main.h:146
T max(const T a, const T b)
Definition: Main.h:152
gr_uint8 byte
Definition: Main.h:39
gr_int8 int8
Definition: Main.h:42
gr_uint8 uint8
Definition: Main.h:38
bool checked_mul(const size_t a, const size_t b, size_t &t)
Definition: Main.h:117
T * gralloc(size_t n)
Definition: Main.h:126
gr_uint16 uint16
Definition: Main.h:40
gr_uint32 uint32
Definition: Main.h:41
gr_int32 int32
Definition: Main.h:44
size_t uintptr
Definition: Main.h:45
short gr_int16
Definition: Types.h:35
unsigned short gr_uint16
Definition: Types.h:34
signed char gr_int8
Definition: Types.h:33
unsigned int gr_uint32
Definition: Types.h:36
unsigned char gr_uint8
Definition: Types.h:31
int gr_int32
Definition: Types.h:37
state_type states[100]
Definition: routines.c:44
Definition: inftrees.h:24
Definition: pbmfont.h:4
Definition: dvips.h:235
TT_Glyph glyph
Definition: ttf2pfb.c:162