File: basics.h

package info (click to toggle)
fontforge 1%3A20201107~dfsg-4
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, sid
  • size: 67,192 kB
  • sloc: ansic: 587,351; python: 4,932; perl: 315; sh: 266; cpp: 219; makefile: 55; xml: 11
file content (144 lines) | stat: -rw-r--r-- 4,301 bytes parent folder | download
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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/* Copyright (C) 2000-2012 by George Williams */
/*
 * 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.

 * The name of the author may not be used to endorse or promote products
 * derived from this software without specific prior written permission.

 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``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 AUTHOR 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 FONTFORGE_BASICS_H
#define FONTFORGE_BASICS_H

#include <fontforge-config.h>

#include <inttypes.h>
#include <limits.h>
#include <memory.h>
#include <stdbool.h>
#include <stdio.h>		/* for NULL */
#include <stdlib.h>		/* for free */
#include <string.h>

typedef int32_t		int32;
typedef uint32_t	uint32;
typedef int16_t		int16;
typedef uint16_t	uint16;
typedef int8_t		int8;
typedef uint8_t		uint8;

/* An integral type which can hold a pointer */
typedef intptr_t	intpt;

typedef uint32 unichar_t;

#define FF_PI 3.1415926535897932

/* A macro to mark unused function parameters with. We often
 * have such parameters, because of extensive use of callbacks.
 */
#ifdef UNUSED
#elif defined(__GNUC__)
# define UNUSED(x) UNUSED_ ## x __attribute__((unused))
#elif defined(__LCLINT__)
# define UNUSED(x) /*@unused@*/ x
#else
# define UNUSED(x) x
#endif

/* A macro to print a string for debug purposes
 */
#ifndef NDEBUG
#define TRACE(...) fprintf(stderr, __VA_ARGS__)
#else
#define TRACE(...) while(0)
#endif

/* assert() with an otherwise unused variable
 * to get around "unused" compiler warnings
 */
#ifndef NDEBUG
#define VASSERT(v) assert(v)
#else
#define VASSERT(v) ((void)(v))
#endif

extern void NoMoreMemMessage(void);

static inline int imin(int a, int b)
{
    return (a < b) ? a : b;
}

static inline int imax(int a, int b)
{
    return (a < b) ? b : a;
}

#define IS_IN_ORDER3( a, b, c )   ( ((a)<=(b)) && ((b)<=(c)) )


/**
 * Many lists in FontForge are singly linked. At times you might want
 * to append to the list which, when you only have a pointer to the
 * start of the list can be more verbose than one would like. To use
 * this macro you must defined a null initialized variable 'last'
 * outside of any loop that traverses the source list. The last
 * variable is used used by this macro to quickly append to the list
 * as you go. This macro also assumes that the 'last' and 'newitem'
 * types have a member "->next" which contains the single linked list
 * pointer to the next element.
 *
 * Efficient list append should really be a one line call in the bulk
 * of the code :)
 *
 * example:
 * MyListObjectType* newfoolast = 0;
 * MyListObjectType* newfoolist = 0;
 * 
 * for( ... iterate a source collection of foos ... )
 * {
 *    MyListObjectType* foocopy = CopyIt( foo );
 *    FFLIST_SINGLE_LINKED_APPEND( newfoolist, newfoolast, foocopy );
 * }
 */
#define FFLIST_SINGLE_LINKED_APPEND( head, last, newitem ) \
		    if ( !last )		       \
		    {				       \
			newitem->next = 0;	       \
			head = last = newitem;	       \
		    }				       \
		    else			       \
		    {				       \
			last->next = newitem;	       \
			last = newitem;		       \
		    }

#ifdef __GNU__
#  ifndef PATH_MAX
#    define PATH_MAX 4096
#  endif
#  ifndef MAXPATHLEN
#    define MAXPATHLEN 4096
#  endif
#endif

#endif /* FONTFORGE_BASICS_H */