libfsbv.c - clic - Clic is an command line interactive client for gopher written in Common LISP (HTM) git clone git://bitreich.org/clic/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/clic/ (DIR) Log (DIR) Files (DIR) Refs (DIR) Tags (DIR) README (DIR) 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 calls 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 }