Added some useful variables to java.make
[nativez] / src / notzed.nativez / jni / nativez-windows.c
1 /*
2  * Copyright (C) 2019 Michael Zucchi
3  *
4  * This file is part of nativez <https://www.zedzone.space/software/nativez.html>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions are
8  * met:
9  *
10  *     (1) Redistributions of source code must retain the above copyright
11  *     notice, this list of conditions and the following disclaimer. 
12  *
13  *     (2) Redistributions in binary form must reproduce the above copyright
14  *     notice, this list of conditions and the following disclaimer in
15  *     the documentation and/or other materials provided with the
16  *     distribution.  
17  *     
18  *     (3)The name of the author may not be used to
19  *     endorse or promote products derived from this software without
20  *     specific prior written permission.
21  * 
22  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
23  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
24  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
25  * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
26  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
27  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
28  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
30  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
31  * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
32  * POSSIBILITY OF SUCH DAMAGE. 
33  * 
34  */
35
36 #include <windows.h>
37
38 #include "nativez.h"
39
40 static int fail(const char *ctx, const char *what) {
41         fprintf(stderr, "%s: %s\n", ctx, what);
42         perror(ctx);
43         fflush(stderr);
44         return -1;
45 }
46
47 int nativez_ResolveLibraries(JNIEnv *env, NZLibTable *table) {
48         for (int i=0;table[i].name;i++) {
49                 table[i].lib = LoadLibrary(table[i].name);
50                 if (!table[i].lib && (table[i].flags & NZSO_NONCORE) == 0)
51                         return fail("open library", table[i].name);
52         }
53         return 0;
54 }
55
56 int nativez_ResolveFunctions(JNIEnv *env, const NZLibTable *table, const char *fn_names, void *fnp) {
57         void *lib = NULL;
58         const char *name = fn_names;
59         int index = 0;
60         const char *lib_name = "";
61         void **fn = fnp;
62         int lib_flags = 0;
63         
64         while (*name) {
65                 const char *next = name + strlen(name) + 1;
66
67                 if (*name == '#') {
68                         lib = NULL;
69                         lib_flags = 0;
70                         lib_name = name+1;
71                         for (int i=0;table[i].name;i++) {
72                                 if (strcmp(table[i].name, lib_name) == 0) {
73                                         lib = table[i].lib;
74                                         lib_flags = table[i].flags;
75                                         break;
76                                 }
77                         }
78                 } else if (lib) {
79                         void *entry = GetProcAddress(lib, name);
80
81                         fn[index++] = entry;
82                         if (!entry)
83                                 return fail("resolve function", name);
84                 } else if ((lib_flags & NZSO_NONCORE) == 0) {
85                         return fail(lib_name, name);
86                 }
87
88                 name = next;
89         }
90
91         return 0;
92 }