on df5bf81 help sign in
Idris-dev/java/org/idris/rts/ForeignPrimitives.java
198 lines 5.9 kB history raw
1package org.idris.rts;
3import java.util.Arrays;
4import java.util.List;
5import java.util.Map;
6import java.util.HashMap;
7import java.util.Set;
8import java.util.HashSet;
9import java.io.Closeable;
10import java.io.File;
11import java.io.IOException;
12import java.io.EOFException;
13import java.io.PrintStream;
14import java.io.InputStream;
15import java.nio.ByteBuffer;
16import java.nio.file.Files;
17import java.nio.file.OpenOption;
18import java.nio.file.StandardOpenOption;
19import java.nio.channels.Channels;
20import java.nio.channels.SeekableByteChannel;
21import java.nio.channels.ReadableByteChannel;
22import java.util.concurrent.BlockingQueue;
23import java.util.concurrent.LinkedBlockingQueue;
24import java.util.concurrent.Semaphore;
26@SuppressWarnings("unchecked")
27public class ForeignPrimitives {
28 private static final Map<Thread, List<String>> args = new HashMap<>();
29 private static final Semaphore messageMutex = new Semaphore(1);
30 private static final Map<Thread, BlockingQueue<Object>> messages = new HashMap<>();
31 private static final Set<Object> feofFiles = new HashSet<>();
33 public static synchronized void idris_initArgs(Thread t, String [] args) {
34 ForeignPrimitives.args.put(t, Arrays.asList(args));
35 }
37 public static synchronized int idris_numArgs(Object thread) {
38 List<String> argsForThread = ForeignPrimitives.args.get((Thread)thread);
39 return (argsForThread == null ? 0 : argsForThread.size());
40 }
42 public static synchronized String idris_getArg(Object thread, int num) {
43 List<String> argsForThread = ForeignPrimitives.args.get((Thread)thread);
44 return (argsForThread == null ? null : argsForThread.get(num));
45 }
47 public static String getenv(String x) {
48 return System.getenv(x);
49 }
51 public static void exit(int exitCode) {
52 System.exit(exitCode);
53 }
55 public static void usleep(int microsecs) {
56 try {
57 Thread.sleep(microsecs / 1000, microsecs % 1000);
58 } catch (InterruptedException ex) {
59 }
60 }
62 public static void idris_sendMessage(Object from, Object dest, Object message) throws InterruptedException {
63 messageMutex.acquire();
64 BlockingQueue<Object> messagesForTarget = messages.get((Thread)dest);
65 if (messagesForTarget == null) {
66 messagesForTarget = new LinkedBlockingQueue<>();
67 messages.put((Thread)dest, messagesForTarget);
68 }
69 messagesForTarget.put(message);
70 messageMutex.release();
71 }
73 public static int idris_checkMessage(Object dest) throws InterruptedException {
74 messageMutex.acquire();
75 BlockingQueue<Object> messagesForTarget = messages.get((Thread)dest);
76 messageMutex.release();
77 return (messagesForTarget == null ? 0 : messagesForTarget.size());
78 }
80 public static Object idris_recvMessage(Object dest) throws InterruptedException {
81 messageMutex.acquire();
82 BlockingQueue<Object> messagesForTarget = messages.get((Thread)dest);
83 if (messagesForTarget == null) {
84 messagesForTarget = new LinkedBlockingQueue();
85 messages.put((Thread)dest, messagesForTarget);
86 }
87 messageMutex.release();
88 return messagesForTarget.take();
89 }
91 public static void putStr(String str) {
92 System.out.print(str);
93 }
95 public static void putchar(char c) {
96 System.out.print(c);
97 }
99 public static int getchar() {
100 try {
101 return (char)System.in.read();
102 } catch (IOException ex) {
103 return -1;
104 }
105 }
107 public static SeekableByteChannel fileOpen(String name, String privs) {
108 try {
109 OpenOption [] options;
110 switch (privs) {
111 case "r" :
112 options = new StandardOpenOption []
113 { StandardOpenOption.READ };
114 break;
115 case "r+" :
116 options = new StandardOpenOption []
117 { StandardOpenOption.READ,
118 StandardOpenOption.WRITE };
119 break;
120 case "w" :
121 options = new StandardOpenOption []
122 { StandardOpenOption.WRITE,
123 StandardOpenOption.CREATE };
124 break;
125 case "w+" :
126 options = new StandardOpenOption []
127 { StandardOpenOption.READ,
128 StandardOpenOption.WRITE,
129 StandardOpenOption.CREATE };
130 break;
131 case "a" :
132 options = new StandardOpenOption []
133 { StandardOpenOption.WRITE,
134 StandardOpenOption.CREATE,
135 StandardOpenOption.APPEND };
136 break;
137 case "a+" :
138 options = new StandardOpenOption []
139 { StandardOpenOption.READ,
140 StandardOpenOption.WRITE,
141 StandardOpenOption.CREATE,
142 StandardOpenOption.APPEND };
143 break;
144 default :
145 options = new StandardOpenOption [] {};
146 break;
147 }
148 return Files.newByteChannel(new File(name).toPath(), options);
149 } catch (IOException ex) {
150 return null;
151 }
152 }
154 public static synchronized void fileClose(Object file) throws IOException {
155 ((Closeable)file).close();
156 feofFiles.remove(file);
157 }
159 public static void fputStr(Object file, String string) throws IOException {
160 if (file instanceof PrintStream) {
161 ((PrintStream)file).print(string);
162 } else if (file instanceof SeekableByteChannel) {
163 ((SeekableByteChannel)file).write(ByteBuffer.wrap(string.getBytes()));
164 }
165 }
167 public static synchronized String idris_readStr(Object file) throws IOException {
168 ReadableByteChannel channel = file instanceof InputStream ?
169 Channels.newChannel((InputStream)file) :
170 (ReadableByteChannel)file;
171 ByteBuffer buf = ByteBuffer.allocate(1);
172 StringBuilder resultBuilder = new StringBuilder("");
173 String delimiter = System.getProperty("line.separator");
174 int read = 0;
175 do {
176 buf.rewind();
177 read = channel.read(buf);
178 if (read > 0) {
179 resultBuilder.append(new String(buf.array()));
180 if (resultBuilder.lastIndexOf(delimiter) > -1) {
181 return resultBuilder.toString();
182 }
183 }
184 if (read < 0) {
185 feofFiles.add(file);
186 }
187 } while (read >= 0);
188 return resultBuilder.toString();
189 }
191 public static int fileEOF(Object file) {
192 return (feofFiles.contains(file) ? 1 : 0);
193 }
195 public static int isNull(Object o) {
196 return (o == null ? 1 : 0);
197 }