source: EcnlProtoTool/trunk/mrbgems/mruby-arduino/src/sMem.c

Last change on this file was 321, checked in by coas-nagasima, 7 years ago

文字コードを設定

  • Property svn:eol-style set to native
  • Property svn:mime-type set to text/x-csrc;charset=UTF-8
File size: 6.6 KB
Line 
1/*
2 * ファイル関連
3 *
4 * Copyright (c) 2016 Wakayama.rb Ruby Board developers
5 *
6 * This software is released under the MIT License.
7 * https://github.com/wakayamarb/wrbb-v2lib-firm/blob/master/MITL
8 *
9 */
10#include <arduino.h>
11/*#include <eepfile.h>*/
12
13#include <mruby.h>
14#include <mruby/string.h>
15
16#include "../llbruby.h"
17
18FILEEEP Fpj0;
19FILEEEP *Fp0 = &Fpj0; /*コマンド用*/
20FILEEEP Fpj1;
21FILEEEP *Fp1 = &Fpj1; /*コマンド用*/
22
23/******************************************************/
24/* openしたファイルから1バイト読み込みます: MemFile.read*/
25/* MemFile.read( number )*/
26/* number: ファイル番号 0 または 1*/
27/* 戻り値*/
28/* 0x00~0xFFが返る。ファイルの最後だったら-1が返る。*/
29/******************************************************/
30mrb_value mrb_mem_read(mrb_state *mrb, mrb_value self)
31{
32 int num;
33
34 mrb_get_args(mrb, "i", &num);
35
36 int dat = -1;
37 if (num == 0) {
38 dat = EEP_fread(Fp0);
39 }
40 else if (num == 1) {
41 dat = EEP_fread(Fp1);
42 }
43
44 return mrb_fixnum_value(dat);
45}
46
47/******************************************************/
48/* openしたファイルバイナリデータを書き込む: MemFile.write*/
49/* MemFile.write( number, buf, len )*/
50/* number: ファイル番号 0 または 1*/
51/* buf: 書き込むデータ*/
52/* len: 書き込むデータサイズ*/
53/* 戻り値*/
54/* 実際に書いたバイト数*/
55/******************************************************/
56mrb_value mrb_mem_write(mrb_state *mrb, mrb_value self)
57{
58 int num, len;
59 mrb_value value;
60 char *str;
61
62 mrb_get_args(mrb, "iSi", &num, &value, &len);
63
64 str = RSTRING_PTR(value);
65
66 int ret = 0;
67 if (num == 0) {
68 EEP_fwrite(Fp0, str, &len);
69 ret = len;
70 }
71 else if (num == 1) {
72 EEP_fwrite(Fp1, str, &len);
73 ret = len;
74 }
75
76 return mrb_fixnum_value(ret);
77}
78
79/******************************************************/
80/* ファイルをオープンします: MemFile.open*/
81/* MemFile.open( number, filename[, mode] )*/
82/* number: ファイル番号 0 または 1*/
83/* filename: ファイル名(8.3形式)*/
84/* mode: 0:Read, 1:Append, 2:New Create*/
85/* 戻り値*/
86/* 成功: 番号, 失敗: -1*/
87/******************************************************/
88mrb_value mrb_mem_open(mrb_state *mrb, mrb_value self)
89{
90 int num;
91 int mode;
92 mrb_value value;
93 char *str;
94
95 int n = mrb_get_args(mrb, "iS|i", &num, &value, &mode);
96
97 str = RSTRING_PTR(value);
98
99 if (n < 3) {
100 mode = 0;
101 }
102
103 int ret = -1;
104 if (num == 0) {
105 if (mode == 1) {
106 if (EEP_fopen(Fp0, str, EEP_APPEND) != -1) {
107 ret = num;
108 }
109 }
110 else if (mode == 2) {
111 if (EEP_fopen(Fp0, str, EEP_WRITE) != -1) {
112 ret = num;
113 }
114 }
115 else {
116 if (EEP_fopen(Fp0, str, EEP_READ) != -1) {
117 ret = num;
118 }
119 }
120 }
121 else if (num == 1) {
122 if (mode == 1) {
123 if (EEP_fopen(Fp1, str, EEP_APPEND) != -1) {
124 ret = num;
125 }
126 }
127 else if (mode == 2) {
128 if (EEP_fopen(Fp1, str, EEP_WRITE) != -1) {
129 ret = num;
130 }
131 }
132 else {
133 if (EEP_fopen(Fp1, str, EEP_READ) != -1) {
134 ret = num;
135 }
136 }
137 }
138
139 return mrb_fixnum_value(ret);
140}
141
142
143/******************************************************/
144/* ファイルをクローズします: MemFile.close( number )*/
145/* MemFile.close( number )*/
146/* number: ファイル番号 0 または 1*/
147/******************************************************/
148mrb_value mrb_mem_close(mrb_state *mrb, mrb_value self)
149{
150 int num;
151
152 mrb_get_args(mrb, "i", &num);
153
154 if (num == 0) {
155 EEP_fclose(Fp0);
156 }
157 else if (num == 1) {
158 EEP_fclose(Fp1);
159 }
160
161 return mrb_nil_value(); /*戻り値は無しですよ。*/
162}
163
164/******************************************************/
165/* openしたファイルの読み出し位置を移動する: MemFile.seek*/
166/* MemFile.seek( number, byte )*/
167/* number: ファイル番号 0 または 1*/
168/* byte: seekするバイト数(-1)でファイルの最後に移動する*/
169/* 戻り値*/
170/* 成功: 1, 失敗: 0*/
171/******************************************************/
172mrb_value mrb_mem_seek(mrb_state *mrb, mrb_value self)
173{
174 int num;
175 int size;
176 int ret = 0;
177
178 mrb_get_args(mrb, "ii", &num, &size);
179
180 if (num == 0) {
181 if (size == -1) {
182 if (EEP_fseek(Fp0, 0, EEP_SEEKEND)) {
183 ret = 1;
184 }
185 }
186 else {
187 if (EEP_fseek(Fp0, size, EEP_SEEKTOP)) {
188 ret = 1;
189 }
190 }
191 }
192 else if (num == 1) {
193 if (size == -1) {
194 if (EEP_fseek(Fp1, 0, EEP_SEEKEND)) {
195 ret = 1;
196 }
197 }
198 else {
199 if (EEP_fseek(Fp1, size, EEP_SEEKTOP)) {
200 ret = 1;
201 }
202 }
203 }
204 return mrb_fixnum_value(ret);
205}
206
207/******************************************************/
208/* ファイルをコピーします: MemFile.cp*/
209/* MemFile.cp( srcFilename, dstFilename[, mode] )*/
210/* srcFilename: コピー元ファイル名*/
211/* dstFilename: コピー先ファイル名*/
212/* mode: 0上書きしない, 1:上書きする*/
213/* 戻り値*/
214/* 成功: 1, 失敗: 0*/
215/******************************************************/
216mrb_value mrb_mem_cp(mrb_state *mrb, mrb_value self)
217{
218 mrb_value src, dst;
219 int mode;
220 int ret = 1;
221
222 int n = mrb_get_args(mrb, "SS|i", &src, &dst, &mode);
223
224 /*DEBUG_PRINT("MemFile.copy", n);*/
225
226 if (n < 3) {
227 mode = 0;
228 }
229
230 if (mode == 0) {
231 if (!EEP_fexist(RSTRING_PTR(dst))) {
232 mode = 1;
233 }
234 }
235
236 /*DEBUG_PRINT("mode", mode);*/
237
238 if (mode == 1) {
239 if (EEP_fcopy(RSTRING_PTR(src), RSTRING_PTR(dst)) == -1) {
240 ret = 0;
241 }
242 }
243 return mrb_fixnum_value(ret);
244}
245
246/******************************************************/
247/* ファイルを削除します: MemFile.rm*/
248/* MemFile.rm( Filename )*/
249/* Filename: 削除するファイル名*/
250/* 戻り値*/
251/* 成功: 1, 失敗: 0*/
252/******************************************************/
253mrb_value mrb_mem_rm(mrb_state *mrb, mrb_value self)
254{
255 mrb_value src;
256 int ret = 1;
257
258 mrb_get_args(mrb, "S", &src);
259
260 if (EEP_fdelete(RSTRING_PTR(src)) == -1) {
261 ret = 0;
262 }
263 return mrb_fixnum_value(ret);
264}
265
266/******************************************************/
267/* ライブラリを定義します*/
268/******************************************************/
269void mem_Init(mrb_state *mrb)
270{
271 struct RClass *memdModule = mrb_define_module(mrb, "MemFile");
272
273 mrb_define_module_function(mrb, memdModule, "read", mrb_mem_read, MRB_ARGS_REQ(1));
274
275 mrb_define_module_function(mrb, memdModule, "seek", mrb_mem_seek, MRB_ARGS_REQ(2));
276
277 mrb_define_module_function(mrb, memdModule, "write", mrb_mem_write, MRB_ARGS_REQ(3));
278
279 mrb_define_module_function(mrb, memdModule, "open", mrb_mem_open, MRB_ARGS_REQ(2) | MRB_ARGS_OPT(1));
280
281 mrb_define_module_function(mrb, memdModule, "close", mrb_mem_close, MRB_ARGS_REQ(1));
282
283 mrb_define_module_function(mrb, memdModule, "cp", mrb_mem_cp, MRB_ARGS_REQ(2) | MRB_ARGS_OPT(1));
284
285 mrb_define_module_function(mrb, memdModule, "rm", mrb_mem_rm, MRB_ARGS_REQ(1));
286}
Note: See TracBrowser for help on using the repository browser.