aboutsummaryrefslogtreecommitdiff
path: root/win32
diff options
context:
space:
mode:
Diffstat (limited to 'win32')
-rw-r--r--win32/Makefile91
-rw-r--r--win32/build.cmd41
-rw-r--r--win32/fcp.c167
-rw-r--r--win32/make-clean.cmd5
-rw-r--r--win32/ter-font.rc132
-rw-r--r--win32/ter-main.c9
-rw-r--r--win32/terminus.nsi307
7 files changed, 752 insertions, 0 deletions
diff --git a/win32/Makefile b/win32/Makefile
new file mode 100644
index 000000000000..7a52b73643f2
--- /dev/null
+++ b/win32/Makefile
@@ -0,0 +1,91 @@
+INT = python3
+EXT = py
+BIN = ../bin
+UNI = ../uni
+
+UCS2ANY = $(INT) $(BIN)/ucstoany.$(EXT)
+BDF2FNT = $(INT) $(BIN)/bdftofnt.$(EXT) -fModern
+
+RC32 = windres -F pe-i386
+CC32 = i686-w64-mingw32-gcc
+CFLAGS = -O2 -Wall -Wextra
+LDFLAGS = -mwindows -s
+FONFLAGS = -shared -nostdlib -nostartfiles
+
+REG_MS_1252 = Microsoft CP1252
+REG_MS_1250 = Microsoft CP1250
+REG_MS_1253 = Microsoft CP1253
+REG_MS_1254 = Microsoft CP1254
+REG_MS_1251 = Microsoft CP1251
+REG_MS_1257 = Microsoft CP1257
+REG_MS_1255 = Microsoft CP1255
+REG_IBM_437 = IBM CP437
+REG_BG_MIK = Bulgarian MIK
+
+FNT_MS_1252 = ter-112n.fnt ter-112b.fnt ter-114n.fnt ter-114b.fnt ter-116n.fnt ter-116b.fnt ter-118n.fnt ter-118b.fnt ter-120n.fnt ter-120b.fnt ter-122n.fnt ter-122b.fnt ter-124n.fnt ter-124b.fnt ter-128n.fnt ter-128b.fnt ter-132n.fnt ter-132b.fnt
+FNT_MS_1250 = ter-212n.fnt ter-212b.fnt ter-214n.fnt ter-214b.fnt ter-216n.fnt ter-216b.fnt ter-218n.fnt ter-218b.fnt ter-220n.fnt ter-220b.fnt ter-222n.fnt ter-222b.fnt ter-224n.fnt ter-224b.fnt ter-228n.fnt ter-228b.fnt ter-232n.fnt ter-232b.fnt
+FNT_MS_1253 = ter-712n.fnt ter-712b.fnt ter-714n.fnt ter-714b.fnt ter-716n.fnt ter-716b.fnt ter-718n.fnt ter-718b.fnt ter-720n.fnt ter-720b.fnt ter-722n.fnt ter-722b.fnt ter-724n.fnt ter-724b.fnt ter-728n.fnt ter-728b.fnt ter-732n.fnt ter-732b.fnt
+FNT_MS_1254 = ter-912n.fnt ter-912b.fnt ter-914n.fnt ter-914b.fnt ter-916n.fnt ter-916b.fnt ter-918n.fnt ter-918b.fnt ter-920n.fnt ter-920b.fnt ter-922n.fnt ter-922b.fnt ter-924n.fnt ter-924b.fnt ter-928n.fnt ter-928b.fnt ter-932n.fnt ter-932b.fnt
+FNT_MS_1251 = ter-c12n.fnt ter-c12b.fnt ter-c14n.fnt ter-c14b.fnt ter-c16n.fnt ter-c16b.fnt ter-c18n.fnt ter-c18b.fnt ter-c20n.fnt ter-c20b.fnt ter-c22n.fnt ter-c22b.fnt ter-c24n.fnt ter-c24b.fnt ter-c28n.fnt ter-c28b.fnt ter-c32n.fnt ter-c32b.fnt
+FNT_MS_1257 = ter-d12n.fnt ter-d12b.fnt ter-d14n.fnt ter-d14b.fnt ter-d16n.fnt ter-d16b.fnt ter-d18n.fnt ter-d18b.fnt ter-d20n.fnt ter-d20b.fnt ter-d22n.fnt ter-d22b.fnt ter-d24n.fnt ter-d24b.fnt ter-d28n.fnt ter-d28b.fnt ter-d32n.fnt ter-d32b.fnt
+FNT_MS_1255 = ter-h12n.fnt ter-h12b.fnt ter-h14n.fnt ter-h14b.fnt ter-h16n.fnt ter-h16b.fnt ter-h18n.fnt ter-h18b.fnt ter-h20n.fnt ter-h20b.fnt ter-h22n.fnt ter-h22b.fnt ter-h24n.fnt ter-h24b.fnt ter-h28n.fnt ter-h28b.fnt ter-h32n.fnt ter-h32b.fnt
+FNT_IBM_437 = ter-i12n.fnt ter-i12b.fnt ter-i14n.fnt ter-i14b.fnt ter-i16n.fnt ter-i16b.fnt ter-i18n.fnt ter-i18b.fnt ter-i20n.fnt ter-i20b.fnt ter-i22n.fnt ter-i22b.fnt ter-i24n.fnt ter-i24b.fnt ter-i28n.fnt ter-i28b.fnt ter-i32n.fnt ter-i32b.fnt
+FNT_BG_MIK = ter-m12n.fnt ter-m12b.fnt ter-m14n.fnt ter-m14b.fnt ter-m16n.fnt ter-m16b.fnt ter-m18n.fnt ter-m18b.fnt ter-m20n.fnt ter-m20b.fnt ter-m22n.fnt ter-m22b.fnt ter-m24n.fnt ter-m24b.fnt ter-m28n.fnt ter-m28b.fnt ter-m32n.fnt ter-m32b.fnt
+FNT = $(FNT_MS_1252) $(FNT_MS_1250) $(FNT_MS_1253) $(FNT_MS_1254) $(FNT_MS_1251) $(FNT_MS_1257) $(FNT_MS_1255)
+
+all: $(FNT) terminus.fon fcpw.exe
+
+WIN_MS_1252 = $(UNI)/cntrl.uni $(UNI)/ascii-h.uni $(UNI)/win-1252.uni
+WIN_MS_1250 = $(UNI)/cntrl.uni $(UNI)/ascii-h.uni $(UNI)/win-1250.uni
+WIN_MS_1253 = $(UNI)/cntrl.uni $(UNI)/ascii-h.uni $(UNI)/win-1253.uni
+WIN_MS_1254 = $(UNI)/cntrl.uni $(UNI)/ascii-h.uni $(UNI)/win-1254.uni
+WIN_MS_1251 = $(UNI)/cntrl.uni $(UNI)/ascii-h.uni $(UNI)/x11-1251.uni $(UNI)/win-1251.uni
+WIN_MS_1257 = $(UNI)/cntrl.uni $(UNI)/ascii-h.uni $(UNI)/x11-1257.uni $(UNI)/win-1257.uni
+WIN_MS_1255 = $(UNI)/cntrl.uni $(UNI)/ascii-h.uni $(UNI)/win-1255.uni
+WIN_IBM_437 = $(UNI)/cntrl.uni $(UNI)/ascii-h.uni $(UNI)/ibm-437.uni
+WIN_BG_MIK = $(UNI)/cntrl.uni $(UNI)/ascii-h.uni $(UNI)/bg-mik.uni
+
+$(FNT_MS_1252): ter-1%.fnt : ter-u%.bdf $(WIN_MS_1252)
+ $(UCS2ANY) $< $(REG_MS_1252) $(WIN_MS_1252) | $(BDF2FNT) -o $@
+
+$(FNT_MS_1250): ter-2%.fnt : ter-u%.bdf $(WIN_MS_1250)
+ $(UCS2ANY) $< $(REG_MS_1250) $(WIN_MS_1250) | $(BDF2FNT) -o $@
+
+$(FNT_MS_1253): ter-7%.fnt : ter-u%.bdf $(WIN_MS_1253)
+ $(UCS2ANY) $< $(REG_MS_1253) $(WIN_MS_1253) | $(BDF2FNT) -o $@
+
+$(FNT_MS_1254): ter-9%.fnt : ter-u%.bdf $(WIN_MS_1254)
+ $(UCS2ANY) $< $(REG_MS_1254) $(WIN_MS_1254) | $(BDF2FNT) -o $@
+
+$(FNT_MS_1251): ter-c%.fnt : ter-u%.bdf $(WIN_MS_1251)
+ $(UCS2ANY) $< $(REG_MS_1251) $(WIN_MS_1251) | $(BDF2FNT) -o $@
+
+$(FNT_MS_1257): ter-d%.fnt : ter-u%.bdf $(WIN_MS_1257)
+ $(UCS2ANY) $< $(REG_MS_1257) $(WIN_MS_1257) | $(BDF2FNT) -o $@
+
+$(FNT_MS_1255): ter-h%.fnt : ter-u%.bdf $(WIN_MS_1255)
+ $(UCS2ANY) $< $(REG_MS_1255) $(WIN_MS_1255) | $(BDF2FNT) -o $@
+
+$(FNT_IBM_437): ter-i%.fnt : ter-u%.bdf $(WIN_IBM_437)
+ $(UCS2ANY) -F Terminal $< $(REG_IBM_437) $(WIN_IBM_437) | $(BDF2FNT) -o $@
+
+$(FNT_BG_MIK): ter-m%.fnt : ter-u%.bdf $(WIN_BG_MIK)
+ $(UCS2ANY) -F Terminal $< $(REG_BG_MIK) $(WIN_BG_MIK) | $(BDF2FNT) -o $@
+
+fnt: $(FNT)
+
+fnt-255: $(FNT_IBM_437) $(FNT_BG_MIK)
+
+ter-font.o: $(FNT) ter-font.rc
+ $(RC32) -o $@ ter-font.rc
+
+terminus.fon: ter-main.c ter-font.o
+ $(CC32) $(CFLAGS) $(LDFLAGS) $(FONFLAGS) -o $@ ter-main.c ter-font.o
+
+fcpw.exe: fcp.c
+ $(CC32) -DFCPW $(CFLAGS) $(LDFLAGS) -o $@ $<
+
+clean:
+ @./make-clean.cmd
+
+.PHONY: all fnt clean
diff --git a/win32/build.cmd b/win32/build.cmd
new file mode 100644
index 000000000000..6d55de54b50c
--- /dev/null
+++ b/win32/build.cmd
@@ -0,0 +1,41 @@
+if errorlevel 1 type nul
+if not exist dup\nul mkdir dup
+if errorlevel 1 exit /b
+
+if not errorlevel 1 copy /y ..\*.bdf
+if not errorlevel 1 make -B -j8 terminus.fon
+if not errorlevel 1 move /y terminus.fon terminus.bak
+
+if not errorlevel 1 call :difftofcp ao2
+if not errorlevel 1 call :difftofcp dv1
+if not errorlevel 1 call :difftofcp ge2
+if not errorlevel 1 call :difftofcp gq2
+if not errorlevel 1 call :difftofcp ij1
+
+if not errorlevel 1 copy /y ..\dup\xos4-2.dup dup
+if not errorlevel 1 call :difftofcp ka2
+
+if not errorlevel 1 call :difftofcp ll2
+if not errorlevel 1 call :difftofcp td1
+if not errorlevel 1 call :difftofcp hi2
+
+if not errorlevel 1 move /y terminus.fon terminus.bak
+if not errorlevel 1 patch --binary -p1 < ..\alt\hi2.diff
+if not errorlevel 1 call :difftofcp hi2-dv1
+
+if not errorlevel 1 patch --binary -p1 < ..\alt\hi2.diff
+if not errorlevel 1 copy /y ..\dup\xos4-2.dup dup
+if not errorlevel 1 call :difftofcp hi2-ka2
+
+if not errorlevel 1 make -B -j8 terminus.fon
+if not errorlevel 1 make fcpw.exe
+if not errorlevel 1 del /q *.bdf *.fnt terminus.bak ter-font.o
+exit /b
+
+:difftofcp
+if not errorlevel 1 patch --binary -p1 < ..\alt\%1.diff
+if not errorlevel 1 make -B -j8 fnt
+if not errorlevel 1 make terminus.fon
+if not errorlevel 1 fc /b terminus.bak terminus.fon > %1.txt
+rem fc sets errorlevel 1 on differences
+if not errorlevel 2 copy /y ..\*.bdf
diff --git a/win32/fcp.c b/win32/fcp.c
new file mode 100644
index 000000000000..e578606c5d69
--- /dev/null
+++ b/win32/fcp.c
@@ -0,0 +1,167 @@
+#include <fcntl.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#ifdef _WIN32
+#include <io.h>
+#else
+#include <unistd.h>
+#endif
+
+#ifdef FCPW
+#include <windows.h>
+#define FCP "fcpw"
+#else
+#define FCP "fcp"
+#endif
+
+#ifndef O_BINARY
+#define O_BINARY 0
+#endif
+
+static void fatal(const char *format, ...)
+{
+ va_list ap;
+#ifdef FCPW
+ char buffer[640];
+
+ va_start(ap, format);
+ vsnprintf(buffer, sizeof buffer, format, ap);
+ MessageBox(NULL, buffer, FCP, MB_ICONSTOP | MB_OK);
+#else
+ fprintf(stderr, "%s: ", FCP);
+ va_start(ap, format);
+ vfprintf(stderr, format, ap);
+ fputc('\n', stderr);
+#endif
+ va_end(ap);
+ exit(1);
+}
+
+static void error(const char *s)
+{
+#ifdef FCPW
+ char buffer[640];
+
+ snprintf(buffer, sizeof buffer, "%s: %s", s, strerror(errno));
+ MessageBox(NULL, buffer, FCP, MB_ICONSTOP | MB_OK);
+#else
+ fprintf(stderr, "%s: ", FCP);
+ perror(s);
+#endif
+ exit(1);
+}
+
+#define SIZE ((1 << 24) + 1)
+
+#ifdef FCPW
+#define main wrap
+#endif
+
+static const char *usage =
+ "usage: " FCP " [OFFSET] FILE PATCH\n"
+ "\n"
+ FCP " 0.10.2, Copyright (C) 2017 Dimitar Toshkov Zhekov\n"
+ "\n"
+ "This program is free software; you can redistribute it and/or\n"
+ "modify it under the terms of the GNU General Public License as\n"
+ "published by the Free Software Foundation; either version 2 of\n"
+ "the License, or (at your option) any later version.\n"
+ "\n"
+ "This program is distributed in the hope that it will be useful,\n"
+ "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
+ "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
+ "GNU General Public License for more details.\n";
+
+int main(int argc, char **argv)
+{
+ unsigned char *buffer;
+ const char *name, *patch;
+ int f, n;
+ FILE *p;
+ char s[0x80];
+ long ignore;
+ long minoff = -1, maxoff;
+
+ if (argc == 4)
+ {
+ argv++;
+ if (sscanf(*argv, "%lx%n", &ignore, &n) != 1 || n != (int) strlen(*argv)) fatal("%s: invalid offset", *argv);
+ if (ignore < 0 || ignore >= SIZE) fatal("%s: offset out of range", ignore);
+ }
+ else if (argc != 3)
+ {
+ #ifdef FCPW
+ MessageBox(NULL, usage, FCP, MB_OK);
+ #else
+ fputs(usage, stderr);
+ #endif
+ return 1;
+ }
+ if ((buffer = malloc(SIZE)) == NULL) error(FCP);
+ name = argv[1];
+ patch = argv[2];
+
+ if ((f = open(name, O_RDWR | O_BINARY)) == -1) error(name);
+ if ((n = read(f, buffer, SIZE)) == -1) error(name);
+ if (n == SIZE) fatal("%s: larger than %d bytes", name, SIZE - 1);
+ if ((p = fopen(patch, "r")) == NULL) error(patch);
+
+ while (fgets(s, sizeof s, p) != NULL)
+ {
+ char *lf;
+ long offset;
+ unsigned orig, chng;
+
+ if ((lf = strchr(s, '\n')) != NULL) *lf = '\0';
+ if (sscanf(s, "%lx: %x %x%n", &offset, &orig, &chng, &n) == 3 && n == (int) strlen(s))
+ {
+ if (offset < 0 || offset >= SIZE) fatal("%s: offset out of range", s);
+ if (orig > 0xFF || chng > 0xFF) fatal("%s: byte(s) out of range", s);
+ if (offset >= ignore)
+ {
+ if (buffer[offset] != orig) fatal("offset %lx not equal to %x", offset, orig);
+ if (orig != chng)
+ {
+ if (minoff == -1) minoff = offset;
+ buffer[maxoff = offset] = chng;
+ }
+ }
+ }
+ #ifdef FCPW
+ #else
+ else
+ fprintf(stderr, "%s: `%s'\n", patch, s);
+ #endif
+ }
+
+ if (minoff >= 0)
+ {
+ if (lseek(f, minoff, SEEK_SET) == -1) error(name);
+ if (write(f, buffer + minoff, maxoff - minoff + 1) == -1) error(name);
+ }
+
+ if (close(f) == -1) error(name);
+ if (fclose(p) == -1) error(patch);
+
+ return 0;
+}
+
+#ifdef FCPW
+int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
+{
+ int i;
+
+ (void) hInstance;
+ (void) hPrevInstance;
+ (void) lpCmdLine;
+ (void) nCmdShow;
+
+ for (i = 1; i < __argc; i++)
+ if (strlen(__argv[i]) > 255) fatal("argument %d too long", i);
+
+ return wrap(__argc, __argv);
+}
+#endif
diff --git a/win32/make-clean.cmd b/win32/make-clean.cmd
new file mode 100644
index 000000000000..859dc294bc09
--- /dev/null
+++ b/win32/make-clean.cmd
@@ -0,0 +1,5 @@
+@echo off
+if not exist ter-font.rc exit /b 1
+if not exist ter-main.c exit /b 1
+echo rm -f *.bdf *.fnt *.txt ter-*.o terminus.fon fcpw.exe
+for %%i in (*.bdf *.fnt *.txt ter-*.o terminus.fon fcpw.exe) do if exist %%i del /q %%i
diff --git a/win32/ter-font.rc b/win32/ter-font.rc
new file mode 100644
index 000000000000..32957de9ac45
--- /dev/null
+++ b/win32/ter-font.rc
@@ -0,0 +1,132 @@
+100 FONT ter-112b.fnt
+101 FONT ter-112n.fnt
+102 FONT ter-114b.fnt
+103 FONT ter-114n.fnt
+104 FONT ter-116b.fnt
+105 FONT ter-116n.fnt
+106 FONT ter-118b.fnt
+107 FONT ter-118n.fnt
+108 FONT ter-120b.fnt
+109 FONT ter-120n.fnt
+110 FONT ter-122b.fnt
+111 FONT ter-122n.fnt
+112 FONT ter-124b.fnt
+114 FONT ter-124n.fnt
+115 FONT ter-128b.fnt
+116 FONT ter-128n.fnt
+117 FONT ter-132b.fnt
+118 FONT ter-132n.fnt
+
+120 FONT ter-212b.fnt
+121 FONT ter-212n.fnt
+122 FONT ter-214b.fnt
+123 FONT ter-214n.fnt
+124 FONT ter-216b.fnt
+125 FONT ter-216n.fnt
+126 FONT ter-218b.fnt
+127 FONT ter-218n.fnt
+128 FONT ter-220b.fnt
+129 FONT ter-220n.fnt
+130 FONT ter-222b.fnt
+131 FONT ter-222n.fnt
+132 FONT ter-224b.fnt
+133 FONT ter-224n.fnt
+134 FONT ter-228b.fnt
+135 FONT ter-228n.fnt
+136 FONT ter-232b.fnt
+137 FONT ter-232n.fnt
+
+140 FONT ter-712b.fnt
+141 FONT ter-712n.fnt
+142 FONT ter-714b.fnt
+143 FONT ter-714n.fnt
+144 FONT ter-716b.fnt
+145 FONT ter-716n.fnt
+146 FONT ter-718b.fnt
+147 FONT ter-718n.fnt
+148 FONT ter-720b.fnt
+149 FONT ter-720n.fnt
+150 FONT ter-722b.fnt
+151 FONT ter-722n.fnt
+152 FONT ter-724b.fnt
+153 FONT ter-724n.fnt
+154 FONT ter-728b.fnt
+155 FONT ter-728n.fnt
+156 FONT ter-732b.fnt
+157 FONT ter-732n.fnt
+
+160 FONT ter-912b.fnt
+161 FONT ter-912n.fnt
+162 FONT ter-914b.fnt
+163 FONT ter-914n.fnt
+164 FONT ter-916b.fnt
+165 FONT ter-916n.fnt
+166 FONT ter-918b.fnt
+167 FONT ter-918n.fnt
+168 FONT ter-920b.fnt
+169 FONT ter-920n.fnt
+170 FONT ter-922b.fnt
+171 FONT ter-922n.fnt
+172 FONT ter-924b.fnt
+173 FONT ter-924n.fnt
+174 FONT ter-928b.fnt
+175 FONT ter-928n.fnt
+176 FONT ter-932b.fnt
+177 FONT ter-932n.fnt
+
+180 FONT ter-c12b.fnt
+181 FONT ter-c12n.fnt
+182 FONT ter-c14b.fnt
+183 FONT ter-c14n.fnt
+184 FONT ter-c16b.fnt
+185 FONT ter-c16n.fnt
+186 FONT ter-c18b.fnt
+187 FONT ter-c18n.fnt
+188 FONT ter-c20b.fnt
+189 FONT ter-c20n.fnt
+190 FONT ter-c22b.fnt
+191 FONT ter-c22n.fnt
+192 FONT ter-c24b.fnt
+193 FONT ter-c24n.fnt
+194 FONT ter-c28b.fnt
+195 FONT ter-c28n.fnt
+196 FONT ter-c32b.fnt
+197 FONT ter-c32n.fnt
+
+200 FONT ter-d12b.fnt
+201 FONT ter-d12n.fnt
+202 FONT ter-d14b.fnt
+203 FONT ter-d14n.fnt
+204 FONT ter-d16b.fnt
+205 FONT ter-d16n.fnt
+206 FONT ter-d18b.fnt
+207 FONT ter-d18n.fnt
+208 FONT ter-d20b.fnt
+209 FONT ter-d20n.fnt
+210 FONT ter-d22b.fnt
+211 FONT ter-d22n.fnt
+212 FONT ter-d24b.fnt
+214 FONT ter-d24n.fnt
+215 FONT ter-d28b.fnt
+216 FONT ter-d28n.fnt
+217 FONT ter-d32b.fnt
+218 FONT ter-d32n.fnt
+
+220 FONT ter-h12b.fnt
+221 FONT ter-h12n.fnt
+222 FONT ter-h14b.fnt
+223 FONT ter-h14n.fnt
+224 FONT ter-h16b.fnt
+225 FONT ter-h16n.fnt
+226 FONT ter-h18b.fnt
+227 FONT ter-h18n.fnt
+228 FONT ter-h20b.fnt
+229 FONT ter-h20n.fnt
+230 FONT ter-h22b.fnt
+231 FONT ter-h22n.fnt
+232 FONT ter-h24b.fnt
+233 FONT ter-h24n.fnt
+234 FONT ter-h28b.fnt
+235 FONT ter-h28n.fnt
+236 FONT ter-h32b.fnt
+237 FONT ter-h32n.fnt
diff --git a/win32/ter-main.c b/win32/ter-main.c
new file mode 100644
index 000000000000..703aeb8a5f47
--- /dev/null
+++ b/win32/ter-main.c
@@ -0,0 +1,9 @@
+#include <windows.h>
+
+BOOL WINAPI DllMainCRTStartup(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+ (void) hinstDLL;
+ (void) fdwReason;
+ (void) lpvReserved;
+ return TRUE;
+}
diff --git a/win32/terminus.nsi b/win32/terminus.nsi
new file mode 100644
index 000000000000..489e15e1781c
--- /dev/null
+++ b/win32/terminus.nsi
@@ -0,0 +1,307 @@
+#
+# Copyright (c) 2019 Dimitar Toshkov Zhekov <dimitar.zhekov@gmail.com>
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License as
+# published by the Free Software Foundation; either version 2 of
+# the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+
+!include nsDialogs.nsh
+!include LogicLib.nsh
+!include FileFunc.nsh
+!include WinVer.nsh
+
+Name "Terminus Font"
+OutFile terminus-font-4.48.exe
+
+XPStyle on
+CRCCheck force
+RequestExecutionLevel admin
+
+InstallDir "$EXEDIR\terminus-font-4.48"
+InstallButtonText "Proceed"
+
+Var ter_dialog
+
+Var apply_ao2
+Var apply_dv1
+Var apply_ge2
+Var apply_gq2
+Var apply_ij1
+Var apply_ka2
+Var apply_ll2
+Var apply_td1
+Var apply_hi2
+
+Var install
+Var unpack
+Var hamster
+Var directory
+Var browse
+
+Var ao2
+Var dv1
+Var ge2
+Var gq2
+Var ij1
+Var ka2
+Var ll2
+Var td1
+Var hi2
+
+Var instate
+
+Page custom ter_dialog_page ter_dialog_page_leave
+Page instfiles
+
+Function install_clicked
+
+ EnableWindow $directory 0
+ EnableWindow $browse 0
+ ${NSD_SetText} $directory "$FONTS"
+
+FunctionEnd
+
+Function unpack_clicked
+
+ ${NSD_SetText} $directory "$INSTDIR"
+ EnableWindow $directory 1
+ EnableWindow $browse 1
+
+FunctionEnd
+
+Function hamster_clicked
+
+ ExecShell "open" "http://terminus-font.sourceforge.net#variants"
+ ToolTips::Classic $hamster "http://terminus-font.sourceforge.net#variants"
+
+FunctionEnd
+
+Function browse_clicked
+
+ nsDialogs::SelectFolderDialog Directory $INSTDIR
+
+ Pop $0
+ ${If} $0 != error
+ StrCpy $INSTDIR "$0"
+ ${NSD_SetText} $directory "$INSTDIR"
+ ${EndIf}
+
+FunctionEnd
+
+Function ter_dialog_page
+
+ nsDialogs::Create 1018
+ Pop $ter_dialog
+
+ ${NSD_CreateLink} 2% 1 11% 10u "Variants"
+ Pop $hamster
+ ${NSD_OnClick} $hamster hamster_clicked
+ ToolTips::Classic $hamster "http://terminus-font.sourceforge.net#variants"
+ ${NSD_CreateGroupBox} 0 0 100% 25u ""
+ ${NSD_CreateCheckBox} 2% 10u 11% 12u "ao2"
+ Pop $apply_ao2
+ ${NSD_CreateCheckBox} 13% 10u 11% 12u "dv1"
+ Pop $apply_dv1
+ ${NSD_CreateCheckBox} 24% 10u 11% 12u "ge2"
+ Pop $apply_ge2
+ ${NSD_CreateCheckBox} 35% 10u 11% 12u "gq2"
+ Pop $apply_gq2
+ ${NSD_CreateCheckBox} 46% 10u 10% 12u "ij1"
+ Pop $apply_ij1
+ ${NSD_CreateCheckBox} 56% 10u 11% 12u "ka2"
+ Pop $apply_ka2
+ ${NSD_CreateCheckBox} 67% 10u 10% 12u "ll2"
+ Pop $apply_ll2
+ ${NSD_CreateCheckBox} 77% 10u 11% 12u "td1"
+ Pop $apply_td1
+ ${NSD_CreateCheckBox} 88% 10u 11% 12u "hi2"
+ Pop $apply_hi2
+
+ ${NSD_CreateRadioButton} 0 28u 14% 12u "Install"
+ Pop $install
+ ${NSD_AddStyle} $install ${WS_GROUP}
+ ${NSD_Check} $install
+ ${NSD_OnClick} $install install_clicked
+ ${NSD_CreateRadioButton} 15% 28u 35% 12u "Unpack and patch only"
+ Pop $unpack
+ ${NSD_UnCheck} $unpack
+ ${NSD_OnClick} $unpack unpack_clicked
+ ${NSD_CreateFileRequest} 0% 42u 95% 12u ""
+ Pop $directory
+ ${NSD_CreateBrowseButton} 95% 42u 5% 12u "..."
+ Pop $browse
+ ${NSD_OnClick} $browse browse_clicked
+ Call install_clicked
+
+ ${NSD_CreateHLine} 0 57u 100% 1u
+ Pop $0
+ ${NSD_AddStyle} $0 ${WS_GROUP}
+ ${NSD_CreateLabel} 2% 63u 96% 8u "Terminus Font is licensed under \
+ the SIL Open Font License, Version 1.1."
+ ${NSD_CreateLabel} 2% 71u 96% 12u "The license is available with a \
+ FAQ at: http://scripts.sil.org/OFL"
+ ${NSD_CreateLabel} 2% 83u 96% 24u "Note: the Windows code pages \
+ contain a total of 356 characters. All other characters \
+ (math, pseudographics etc.) are not currently available."
+ ${NSD_CreateLabel} 2% 107u 96% 12u "Terminus Font 4.48, \
+ Copyright (C) 2019 Dimitar Toshkov Zhekov."
+ ${NSD_CreateLabel} 2% 119u 96% 12u "Report bugs to \
+ <dimitar.zhekov@gmail.com>"
+
+ nsDialogs::Show
+
+FunctionEnd
+
+Function ter_dialog_page_leave
+
+ ${NSD_GetState} $apply_ao2 $0
+ ${IfThen} $0 == ${BST_CHECKED} ${|} StrCpy $ao2 "ao2" ${|}
+ ${NSD_GetState} $apply_dv1 $0
+ ${IfThen} $0 == ${BST_CHECKED} ${|} StrCpy $dv1 "dv1" ${|}
+ ${NSD_GetState} $apply_ge2 $0
+ ${IfThen} $0 == ${BST_CHECKED} ${|} StrCpy $ge2 "ge2" ${|}
+ ${NSD_GetState} $apply_gq2 $0
+ ${IfThen} $0 == ${BST_CHECKED} ${|} StrCpy $gq2 "gq2" ${|}
+ ${NSD_GetState} $apply_ij1 $0
+ ${IfThen} $0 == ${BST_CHECKED} ${|} StrCpy $ij1 "ij1" ${|}
+ ${NSD_GetState} $apply_ka2 $0
+ ${IfThen} $0 == ${BST_CHECKED} ${|} StrCpy $ka2 "ka2" ${|}
+ ${NSD_GetState} $apply_ll2 $0
+ ${IfThen} $0 == ${BST_CHECKED} ${|} StrCpy $ll2 "ll2" ${|}
+ ${NSD_GetState} $apply_td1 $0
+ ${IfThen} $0 == ${BST_CHECKED} ${|} StrCpy $td1 "td1" ${|}
+
+ ${NSD_GetState} $apply_hi2 $0
+ ${If} $0 == ${BST_CHECKED}
+ StrCpy $hi2 "hi2"
+ ${IfThen} $dv1 != "" ${|} StrCpy $dv1 "hi2-dv1" ${|}
+ ${IfThen} $ka2 != "" ${|} StrCpy $ka2 "hi2-ka2" ${|}
+ ${EndIf}
+
+ ${NSD_GetState} $install $instate
+ ${If} $instate == ${BST_UNCHECKED}
+ ${NSD_GetText} $directory $INSTDIR
+ ${If} $INSTDIR == ""
+ MessageBox MB_ICONSTOP|MB_OK "Unpack directory name required"
+ Abort
+ ${EndIf}
+ ${EndIf}
+
+FunctionEnd
+
+Function patch
+
+ Pop $1
+ ${If} $1 != ""
+ ExecWait '"$OUTDIR\fcpw.exe" 4100 terminus.fon $1.txt' $R0
+ ${If} ${Errors}
+ MessageBox MB_OK|MB_ICONEXCLAMATION "Can't run $OUTDIR\fcpw.exe"
+ Abort "Can't run $OUTDIR\fcpw.exe"
+ ${EndIf}
+ ${IfThen} $R0 != 0 ${|} Abort "fcpw.exe failed with exit code $R0" ${|}
+ ${EndIf}
+
+FunctionEnd
+
+!macro PATCH arg
+ push ${arg}
+ Call patch
+!macroend
+
+!define Patch `!insertmacro PATCH`
+
+Section "Install"
+
+ ${If} $instate == ${BST_CHECKED}
+ InitPluginsDir
+ SetOutPath "$PLUGINSDIR"
+ ${Else}
+ SetOutPath "$INSTDIR"
+ ${EndIf}
+
+ File "terminus.fon"
+ File "fcpw.exe"
+ File "ao2.txt"
+ File "dv1.txt"
+ File "ge2.txt"
+ File "gq2.txt"
+ File "ij1.txt"
+ File "ka2.txt"
+ File "ll2.txt"
+ File "td1.txt"
+ File "hi2.txt"
+ File "hi2-dv1.txt"
+ File "hi2-ka2.txt"
+
+ ${Patch} $ao2
+ ${Patch} $ge2
+ ${Patch} $gq2
+ ${Patch} $ij1
+ ${Patch} $hi2
+ ${Patch} $dv1
+ ${Patch} $ka2
+ ${Patch} $ll2
+ ${Patch} $td1
+
+ ${If} $instate == ${BST_CHECKED}
+ ${For} $R0 1 15
+ Push "$FONTS\terminus.fon"
+ System::Call "Gdi32::RemoveFontResource(t s) i.r0"
+ ${IfThen} $0 == 0 ${|} ${ExitFor} ${|}
+ ${Next}
+ SendMessage ${HWND_BROADCAST} ${WM_FONTCHANGE} 0 0 /TIMEOUT=250
+
+ ${Do}
+ ClearErrors
+ CopyFiles "$OUTDIR\terminus.fon" "$FONTS\terminus.fon"
+ ${IfNotThen} ${Errors} ${|} ${Break} ${|}
+ MessageBox MB_RETRYCANCEL|MB_ICONSTOP "Can't copy terminus.fon$\n\
+ $\n\
+ All programs using the font should be stopped." IDRETRY +2
+ Abort "Can't copy terminus.fon"
+ ${Loop}
+
+ ${For} $R1 1 $R0
+ Push "$FONTS\terminus.fon"
+ System::Call "Gdi32::AddFontResource(t s) i.r0"
+ ${IfThen} $0 == 0 ${|} ${ExitFor} ${|}
+ ${Next}
+ SendMessage ${HWND_BROADCAST} ${WM_FONTCHANGE} 0 0 /TIMEOUT=250
+
+ ${If} ${IsNT}
+ StrCpy $1 "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts"
+ ${Else}
+ StrCpy $1 "SOFTWARE\Microsoft\Windows\CurrentVersion\Fonts"
+ ${EndIf}
+ WriteRegStr HKLM "$1" "Terminus" "terminus.fon"
+ ReadRegStr $0 HKLM "$1" "Terminus"
+
+ StrCpy $1 ""
+ ${If} $0 != "terminus.fon"
+ StrCpy $1 'If the font is not available after restart, open Control \
+ Panel -> Fonts, find "Terminus" and open it.$\n$\n'
+ ${EndIf}
+ MessageBox MB_OK '$1\
+ Depending on the Windows font settings, some sizes may be unavailable. \
+ For example, with "Medium - 125%" fonts, 8x14 and 12x24 will likely be \
+ suppressed by 8x16 and 11x22 respectively. This seems to be Windows GUI \
+ problem; if you remove 8x16 and 11x12 with a resource editor, 8x14 and \
+ 12x24 will work.$\n\
+ $\n\
+ Uninstallation: stop all programs using Terminus Font, open Control \
+ Panel -> Fonts, find "Terminus" and delete it. If you get an Access \
+ denied error, re-login or restart the system and try again.'
+ ${Else}
+ File "..\AUTHORS"
+ File "..\CHANGES"
+ File "..\OFL.TXT"
+ ${EndIf}
+
+SectionEnd