Skip to content

Commit

Permalink
Added Unix support for GLibPorts
Browse files Browse the repository at this point in the history
  • Loading branch information
smx-smx committed Dec 30, 2017
1 parent 64ccb08 commit cb6acf2
Show file tree
Hide file tree
Showing 34 changed files with 859 additions and 249 deletions.
3 changes: 2 additions & 1 deletion CLanguage/CCodeWriter.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using GLibPorts;
using GLibPorts.Native;
using System;
using System.Collections.Generic;
using System.Diagnostics;
Expand Down Expand Up @@ -44,7 +45,7 @@ public bool bol {
private string temp_filename;
private bool file_exists;

private GLib.FileStream stream;
private IFileStream stream;

private int indent;
private int current_line_number = 1;
Expand Down
33 changes: 33 additions & 0 deletions GLibPorts/CharExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GLibPorts {
public static class CharExtensions {
public static bool IsXDigit(this char @this) {
return GChar.isxdigit(@this);
}

public static bool IsDigit(this char @this) {
return Char.IsDigit(@this);
}

public static char ToLower(this char @this) {
return Char.ToLower(@this);
}

public static char ToUpper(this char @this) {
return Char.ToUpper(@this);
}

public static bool IsLetter(this char @this) {
return Char.IsLetter(@this);
}

public static bool IsLetterOrDigit(this char @this) {
return Char.IsLetterOrDigit(@this);
}
}
}
31 changes: 31 additions & 0 deletions GLibPorts/File.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GLibPorts {
public partial class GLib {
internal class File {
public static IntPtr stdin { get; internal set; }
public static IntPtr stderr { get; internal set; }
public static IntPtr stdout { get; internal set; }

public static void InitializeStatic() {
if (Utils.IsUnix()) {
Native.Unix.UnixFile.InitializeStatic();
} else {
Native.Win32.Win32File.InitializeStatic();
}
}

public static void DisposeStatic() {
if (Utils.IsUnix()) {
Native.Unix.UnixFile.DisposeStatic();
} else {
Native.Win32.Win32File.DisposeStatic();
}
}
}
}
}
62 changes: 19 additions & 43 deletions GLibPorts/FileStream.cs
Original file line number Diff line number Diff line change
@@ -1,30 +1,30 @@
using System;
using GLibPorts.Native;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using GLibPorts.Native;

namespace GLibPorts {
public partial class GLib {
public static FileStream stdin;
public static FileStream stderr;
public static FileStream stdout;

public class FileStream : IDisposable {
public static void InitializeStatic() {
DisposeStatic();
stdin = new FileStream(File.stdin);
stderr = new FileStream(File.stderr);
stdout = new FileStream(File.stdout);
}
public class FileStream {
public static IFileStream stdin { get; internal set; }
public static IFileStream stderr { get; internal set; }
public static IFileStream stdout { get; internal set; }

private IntPtr stream;

internal FileStream(IntPtr streamHandle) {
stream = streamHandle;
}

Win32.setvbuf(stream, null, Win32._IONBF, 0);
public static void InitializeStatic() {
DisposeStatic();
if (Utils.IsUnix()) {
Native.Unix.UnixFileStream.InitilizeStatic();
} else {
Native.Win32.Win32FileStream.InitializeStatic();
}
}

public static void DisposeStatic() {
Expand All @@ -33,35 +33,11 @@ public static void DisposeStatic() {
stdout?.Dispose();
}

public void Dispose() {
if (stream != IntPtr.Zero) {
Win32.fclose(stream);
stream = IntPtr.Zero;
}
}

public int fileno() {
return Win32._fileno(stream);
}

public int printf(string format, params VariableArgument[] args) {
return File.fprintf(stream, format, args);
}

public int puts(string str) {
return Win32.fputs(str, stream);
}

public int putc(int c) {
return Win32.putc(c, stream);
}

public static FileStream fdopen(int fd, string mode) {
return new FileStream(Win32._fdopen(fd, mode));
}

public static FileStream open(string filename, string mode) {
return new FileStream(Win32.fopen(filename, mode));
public static IFileStream open(string filePath, string mode) {
if (Utils.IsUnix())
return Native.Unix.UnixFileStream.open(filePath, mode);
else
return Native.Win32.Win32FileStream.open(filePath, mode);
}
}
}
Expand Down
44 changes: 39 additions & 5 deletions GLibPorts/FileUtils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,50 @@ public static bool get_contents(string filename, out string contents, out ulong
length = (ulong)contents.Length;
return true;
}

//TODO(Smx) make an interface for the calls below
private static void close_unix(int outputfd) {
Native.Unix.NativeImports.close(outputfd);
}

public static void close(int outputfd) {
Win32._close(outputfd);
private static void close_win32(int outputfd) {
Native.Win32.NativeImports._close(outputfd);
}

public static int mkstemp(string template, out string filename) {
filename = Win32.mktemp(template);
private static int mkstemp_unix(string template, out string filename) {
filename = Native.Unix.NativeImports.mktemp(template);
if (filename == null)
return -1;
return Native.Unix.NativeImports.open(
filename,
Native.Unix.NativeImports.O_RDWR | Native.Unix.NativeImports.O_CREAT,
0700
);
}

private static int mkstemp_win32(string template, out string filename) {
filename = Native.Win32.NativeImports.mktemp(template);
if (filename == null)
return -1;
return Win32._open(filename, Win32._O_RDWR | Win32._O_CREAT, 0700);
return Native.Win32.NativeImports._open(
filename,
Native.Win32.NativeImports._O_RDWR | Native.Win32.NativeImports._O_CREAT,
0700
);
}

public static void close(int outputfd) {
if (Utils.IsUnix())
close_unix(outputfd);
else
close_win32(outputfd);
}

public static int mkstemp(string template, out string filename) {
if (Utils.IsUnix())
return mkstemp_unix(template, out filename);
else
return mkstemp_win32(template, out filename);
}
}
}
Expand Down
4 changes: 4 additions & 0 deletions GLibPorts/GLib.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,9 @@ public static void GLibInitialize() {
File.InitializeStatic();
FileStream.InitializeStatic();
}

public static IFileStream stdin => FileStream.stdin;
public static IFileStream stderr => FileStream.stderr;
public static IFileStream stdout => FileStream.stdout;
}
}
25 changes: 22 additions & 3 deletions GLibPorts/GLib.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,21 @@
<ItemGroup>
<Compile Include="Assert.cs" />
<Compile Include="FileStream.cs" />
<Compile Include="Native\IFileStream.cs" />
<Compile Include="Native\IModuleLoader.cs" />
<Compile Include="Native\Platform.cs" />
<Compile Include="Native\IStrings.cs" />
<Compile Include="Native\Unix\FileStream.cs" />
<Compile Include="Native\Unix\UnixModuleLoader.cs" />
<Compile Include="Native\Unix\UnixStrings.cs" />
<Compile Include="Native\Varargs\IVariableCombiner.cs" />
<Compile Include="Native\Varargs\UnixVariableCombiner.cs" />
<Compile Include="Native\Varargs\VariableArgument.cs" />
<Compile Include="Native\Varargs\VariableDoubleArgument.cs" />
<Compile Include="Native\Varargs\VariableIntegerArgument.cs" />
<Compile Include="Native\Varargs\VariableStringArgument.cs" />
<Compile Include="Native\Varargs\Win32VariableCombiner.cs" />
<Compile Include="Native\Win32\FileStream.cs" />
<Compile Include="FileUtils.cs" />
<Compile Include="GChar.cs" />
<Compile Include="GEnvironment.cs" />
Expand All @@ -58,10 +73,14 @@
<Compile Include="IEnumerableExtensions.cs" />
<Compile Include="Module.cs" />
<Compile Include="ModuleFlags.cs" />
<Compile Include="Native\File.cs" />
<Compile Include="Native\Varargs.cs" />
<Compile Include="Native\Win32.cs" />
<Compile Include="File.cs" />
<Compile Include="Native\Unix\NativeImports.cs" />
<Compile Include="Native\Unix\UnixFile.cs" />
<Compile Include="Native\Win32\Win32File.cs" />
<Compile Include="Native\Win32\NativeImports.cs" />
<Compile Include="GPath.cs" />
<Compile Include="Native\Win32\Win32ModuleLoader.cs" />
<Compile Include="Native\Win32\Win32Strings.cs" />
<Compile Include="OptionArg.cs" />
<Compile Include="OptionContext.cs" />
<Compile Include="OptionEntry.cs" />
Expand Down
14 changes: 10 additions & 4 deletions GLibPorts/Module.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,18 @@ private Module(IntPtr handle) {
this.handle = handle;
}

private static IModuleLoader loader {
get {
return Platform.ModuleLoader;
}
}

public static Module open(string file_name, ModuleFlags flags) {
IntPtr handle = IntPtr.Zero;
if (file_name == null) {
handle = Win32.GetModuleHandle(null);
handle = loader.GetModuleHandle(null);
} else {
handle = Win32.LoadLibrary(file_name);
handle = loader.LoadLibrary(file_name);
}

if (handle == IntPtr.Zero)
Expand All @@ -31,12 +37,12 @@ public static Module open(string file_name, ModuleFlags flags) {
}

public void symbol(string symbol_name, out IntPtr symbol) {
symbol = Win32.GetProcAddress(handle, symbol_name);
symbol = loader.GetProcAddress(handle, symbol_name);
}

public void Dispose() {
if (handle != IntPtr.Zero) {
Win32.FreeLibrary(handle);
loader.FreeLibrary(handle);
handle = IntPtr.Zero;
}
}
Expand Down
15 changes: 15 additions & 0 deletions GLibPorts/Native/IFileStream.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using GLibPorts.Native.Varargs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GLibPorts.Native {
public interface IFileStream : IDisposable {
int fileno();
int printf(string format, params VariableArgument[] args);
int puts(string str);
int putc(int c);
}
}
15 changes: 15 additions & 0 deletions GLibPorts/Native/IModuleLoader.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GLibPorts.Native {
public interface IModuleLoader {
IntPtr GetProcAddress(IntPtr handle, string symbol_name);
IntPtr LoadLibrary(string library_path);
void FreeLibrary(IntPtr handle);

IntPtr GetModuleHandle(string moduleName);
}
}
12 changes: 12 additions & 0 deletions GLibPorts/Native/IStrings.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GLibPorts.Native {
public interface IStrings {
void sprintf(StringBuilder sb, string format, IntPtr args);
int vscprintf(string format, IntPtr args);
}
}
30 changes: 30 additions & 0 deletions GLibPorts/Native/Platform.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
using GLibPorts.Native.Varargs;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace GLibPorts.Native {
public static class Platform {
public static IModuleLoader ModuleLoader;
public static IStrings Strings;

public static IVariableCombiner MakeVariableCombiner(params VariableArgument[] args) {
if (Utils.IsUnix())
return new UnixVariableCombiner(args);
else
return new Win32VariableCombiner(args);
}

static Platform() {
if (Utils.IsUnix()) {
ModuleLoader = new Unix.UnixModuleLoader();
Strings = new Unix.UnixStrings();
} else {
ModuleLoader = new Win32.Win32ModuleLoader();
Strings = new Win32.Win32Strings();
}
}
}
}
Loading

0 comments on commit cb6acf2

Please sign in to comment.