libfsbv.c - clic - Clic is an command line interactive client for gopher writte… | |
git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65… | |
Log | |
Files | |
Refs | |
Tags | |
README | |
LICENSE | |
--- | |
libfsbv.c (3900B) | |
--- | |
1 /* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil -*- | |
2 * | |
3 * libfsbv.c --- auxiliary C lib for testing foreign structure by value … | |
4 * | |
5 * Copyright (C) 2011, 2015 Liam M. Healy | |
6 * | |
7 * Permission is hereby granted, free of charge, to any person | |
8 * obtaining a copy of this software and associated documentation | |
9 * files (the "Software"), to deal in the Software without | |
10 * restriction, including without limitation the rights to use, copy, | |
11 * modify, merge, publish, distribute, sublicense, and/or sell copies | |
12 * of the Software, and to permit persons to whom the Software is | |
13 * furnished to do so, subject to the following conditions: | |
14 * | |
15 * The above copyright notice and this permission notice shall be | |
16 * included in all copies or substantial portions of the Software. | |
17 * | |
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, | |
19 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF | |
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND | |
21 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT | |
22 * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, | |
23 * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |
24 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER | |
25 * DEALINGS IN THE SOFTWARE. | |
26 */ | |
27 | |
28 #ifdef WIN32 | |
29 #define DLLEXPORT __declspec(dllexport) | |
30 #else | |
31 #define DLLEXPORT | |
32 #endif | |
33 | |
34 #include <stdio.h> | |
35 #include <limits.h> | |
36 #include <string.h> | |
37 #include <stdlib.h> | |
38 #include <stdbool.h> | |
39 #include <math.h> | |
40 #include <float.h> | |
41 | |
42 /* MSVC doesn't have stdint.h and uses a different syntax for stdcall */ | |
43 #ifndef _MSC_VER | |
44 #include <stdint.h> | |
45 #endif | |
46 | |
47 #ifdef WIN32 | |
48 #ifdef _MSC_VER | |
49 #define STDCALL __stdcall | |
50 #else | |
51 #define STDCALL __attribute__((stdcall)) | |
52 #endif | |
53 #else | |
54 #define STDCALL | |
55 #endif | |
56 | |
57 struct struct_pair { | |
58 int a; | |
59 int b; | |
60 }; | |
61 | |
62 struct struct_pair_double { | |
63 struct struct_pair pr; | |
64 double dbl; | |
65 }; | |
66 | |
67 typedef enum { | |
68 ONE = 1, | |
69 TWO, | |
70 THREE, | |
71 FOUR, | |
72 FORTY_ONE = 41, | |
73 FORTY_TWO | |
74 } numeros; | |
75 | |
76 int sumpair (struct struct_pair sp); | |
77 int enumpair (numeros mynum, struct struct_pair sp); | |
78 struct struct_pair doublepair (struct struct_pair dp); | |
79 double prodsumpair (struct struct_pair_double spd); | |
80 struct struct_pair_double doublepairdouble (struct struct_pair_double pd… | |
81 | |
82 DLLEXPORT | |
83 int sumpair (struct struct_pair sp) | |
84 { | |
85 return sp.a + sp.b; | |
86 } | |
87 | |
88 DLLEXPORT | |
89 int enumpair (numeros mynum, struct struct_pair sp) | |
90 { | |
91 if ( mynum == ONE ) | |
92 { | |
93 return sp.a + sp.b; | |
94 } | |
95 else if ( mynum == TWO ) | |
96 { | |
97 return sp.a + 2*sp.b; | |
98 } | |
99 else if ( mynum == THREE ) | |
100 { | |
101 return 2*sp.a + sp.b; | |
102 } | |
103 else if ( mynum == FOUR ) | |
104 { | |
105 return 2*sp.a + 2*sp.b; | |
106 } | |
107 else | |
108 { | |
109 return 41*sp.a + 42*sp.b; | |
110 } | |
111 } | |
112 | |
113 DLLEXPORT | |
114 struct struct_pair makepair (bool cond) | |
115 { | |
116 struct struct_pair ret; | |
117 ret.a = -127; | |
118 ret.b = cond ? 42 : 43; | |
119 return ret; | |
120 } | |
121 | |
122 const struct struct_pair static_pair = { 40, 2}; | |
123 | |
124 DLLEXPORT | |
125 struct struct_pair * returnpairpointer (struct struct_pair ignored) | |
126 { | |
127 return &static_pair; | |
128 } | |
129 | |
130 DLLEXPORT | |
131 struct struct_pair doublepair (struct struct_pair dp) | |
132 { | |
133 struct struct_pair ret; | |
134 ret.a = 2*dp.a; | |
135 ret.b = 2*dp.b; | |
136 return ret; | |
137 } | |
138 | |
139 DLLEXPORT | |
140 double prodsumpair (struct struct_pair_double pd) | |
141 { | |
142 return pd.dbl * sumpair(pd.pr); | |
143 } | |
144 | |
145 DLLEXPORT | |
146 struct struct_pair_double doublepairdouble (struct struct_pair_double pd) | |
147 { | |
148 struct struct_pair_double ret; | |
149 ret.pr = doublepair(pd.pr); | |
150 ret.dbl = 2*pd.dbl; | |
151 return ret; | |
152 } | |
153 | |
154 DLLEXPORT | |
155 unsigned long long ullsum (unsigned long long a, unsigned long long b) | |
156 { | |
157 return a + b; | |
158 } | |
159 | |
160 DLLEXPORT | |
161 struct struct_pair stringlenpair (char *string, struct struct_pair dp) | |
162 { | |
163 struct struct_pair ret; | |
164 int len = strlen(string); | |
165 ret.a = len*dp.a; | |
166 ret.b = len*dp.b; | |
167 return ret; | |
168 } | |
169 | |
170 struct bitfield_struct { | |
171 unsigned int b; | |
172 }; | |
173 | |
174 DLLEXPORT | |
175 struct bitfield_struct structbitfield (unsigned int x) { | |
176 struct bitfield_struct ret; | |
177 ret.b = x; | |
178 return ret; | |
179 } |