|
@@ -39,9 +39,8 @@ ResultType file_init(O_FUNC){
|
|
char *mode;
|
|
char *mode;
|
|
setResultCore(result);
|
|
setResultCore(result);
|
|
parserArgumentUnion(ap, arg, CNEXT_NT);
|
|
parserArgumentUnion(ap, arg, CNEXT_NT);
|
|
- if (!CHECK_RESULT(result)) {
|
|
|
|
|
|
+ if (!CHECK_RESULT(result))
|
|
return result->type;
|
|
return result->type;
|
|
- }
|
|
|
|
freeResult(result);
|
|
freeResult(result);
|
|
|
|
|
|
if ((file = ap[0].value)->value->type != V_file) {
|
|
if ((file = ap[0].value)->value->type != V_file) {
|
|
@@ -71,8 +70,10 @@ ResultType file_init(O_FUNC){
|
|
file->value->data.file.mode = mode;
|
|
file->value->data.file.mode = mode;
|
|
file->value->data.file.is_std = false;
|
|
file->value->data.file.is_std = false;
|
|
file->value->data.file.file = fopen(path, mode);
|
|
file->value->data.file.file = fopen(path, mode);
|
|
-
|
|
|
|
- setResult(result, inter);
|
|
|
|
|
|
+ if (file->value->data.file.file == NULL)
|
|
|
|
+ setResultFromERR(E_TypeException, CNEXT_NT);
|
|
|
|
+ else
|
|
|
|
+ setResult(result, inter);
|
|
return result->type;
|
|
return result->type;
|
|
}
|
|
}
|
|
|
|
|
|
@@ -84,9 +85,8 @@ ResultType file_read(O_FUNC){
|
|
wchar_t *tmp = NULL;
|
|
wchar_t *tmp = NULL;
|
|
setResultCore(result);
|
|
setResultCore(result);
|
|
parserArgumentUnion(ap, arg, CNEXT_NT);
|
|
parserArgumentUnion(ap, arg, CNEXT_NT);
|
|
- if (!CHECK_RESULT(result)) {
|
|
|
|
|
|
+ if (!CHECK_RESULT(result))
|
|
return result->type;
|
|
return result->type;
|
|
- }
|
|
|
|
freeResult(result);
|
|
freeResult(result);
|
|
|
|
|
|
if ((file = ap[0].value)->value->type != V_file || file->value->data.file.file == NULL) {
|
|
if ((file = ap[0].value)->value->type != V_file || file->value->data.file.file == NULL) {
|
|
@@ -94,18 +94,18 @@ ResultType file_read(O_FUNC){
|
|
return R_error;
|
|
return R_error;
|
|
}
|
|
}
|
|
|
|
|
|
- if (ap[1].value != NULL) {
|
|
|
|
|
|
+ fseek(file->value->data.file.file, 0L, SEEK_CUR); // 改变文件状态(什么都没做)
|
|
|
|
+ if (ap[1].value != NULL) { // 指定数量读取
|
|
size_t n;
|
|
size_t n;
|
|
wint_t ch;
|
|
wint_t ch;
|
|
- if (ap[1].value->value->type != V_int)
|
|
|
|
|
|
+ if (ap[1].value->value->type == V_int)
|
|
n = ap[1].value->value->data.int_.num;
|
|
n = ap[1].value->value->data.int_.num;
|
|
- else if (ap[1].value->value->type != V_dou)
|
|
|
|
|
|
+ else if (ap[1].value->value->type == V_dou)
|
|
n = (vint)ap[1].value->value->data.dou.num;
|
|
n = (vint)ap[1].value->value->data.dou.num;
|
|
else {
|
|
else {
|
|
setResultError(E_TypeException, ONLY_ACC(n, num), LINEFILE, true, CNEXT_NT);
|
|
setResultError(E_TypeException, ONLY_ACC(n, num), LINEFILE, true, CNEXT_NT);
|
|
return R_error;
|
|
return R_error;
|
|
}
|
|
}
|
|
-
|
|
|
|
tmp = memWide(n);
|
|
tmp = memWide(n);
|
|
for (int count=0; count < n && (ch = getwc(file->value->data.file.file)) != WEOF; count++)
|
|
for (int count=0; count < n && (ch = getwc(file->value->data.file.file)) != WEOF; count++)
|
|
tmp[count] = ch;
|
|
tmp[count] = ch;
|
|
@@ -114,7 +114,7 @@ ResultType file_read(O_FUNC){
|
|
size_t step = 50;
|
|
size_t step = 50;
|
|
wint_t ch;
|
|
wint_t ch;
|
|
tmp = NULL;
|
|
tmp = NULL;
|
|
- for (int count=1; (ch = getwc(file->value->data.file.file)) != WEOF; count++) {
|
|
|
|
|
|
+ for (int count=1; (ch = fgetwc(file->value->data.file.file)) != WEOF; count++) { // 全部读取
|
|
if (count > n) {
|
|
if (count > n) {
|
|
n += step;
|
|
n += step;
|
|
tmp = memWideExpansion(tmp, n, true);
|
|
tmp = memWideExpansion(tmp, n, true);
|
|
@@ -128,6 +128,41 @@ ResultType file_read(O_FUNC){
|
|
return result->type;
|
|
return result->type;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ResultType file_readline(O_FUNC){
|
|
|
|
+ ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
|
|
|
|
+ {.must=-1}};
|
|
|
|
+ LinkValue *file;
|
|
|
|
+ wchar_t *tmp = NULL;
|
|
|
|
+ size_t n = 0;
|
|
|
|
+ size_t step = 50;
|
|
|
|
+ wint_t ch;
|
|
|
|
+
|
|
|
|
+ setResultCore(result);
|
|
|
|
+ parserArgumentUnion(ap, arg, CNEXT_NT);
|
|
|
|
+ if (!CHECK_RESULT(result))
|
|
|
|
+ return result->type;
|
|
|
|
+ freeResult(result);
|
|
|
|
+
|
|
|
|
+ if ((file = ap[0].value)->value->type != V_file || file->value->data.file.file == NULL) {
|
|
|
|
+ setResultError(E_TypeException, INSTANCE_ERROR(file), LINEFILE, true, CNEXT_NT);
|
|
|
|
+ return R_error;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ fseek(file->value->data.file.file, 0L, SEEK_CUR); // 改变文件状态(什么都没做)
|
|
|
|
+ tmp = NULL;
|
|
|
|
+ for (int count=1; (ch = fgetwc(file->value->data.file.file)) != WEOF && ch != '\n'; count++) { // 读取到行末
|
|
|
|
+ if (count > n) {
|
|
|
|
+ n += step;
|
|
|
|
+ tmp = memWideExpansion(tmp, n, true);
|
|
|
|
+ }
|
|
|
|
+ tmp[count - 1] = ch;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ makeStringValue(tmp, LINEFILE, CNEXT_NT);
|
|
|
|
+ memFree(tmp);
|
|
|
|
+ return result->type;
|
|
|
|
+}
|
|
|
|
+
|
|
ResultType file_write(O_FUNC){
|
|
ResultType file_write(O_FUNC){
|
|
ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
|
|
ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
|
|
{.type=name_value, .must=1, .name=L"str", .long_arg=false},
|
|
{.type=name_value, .must=1, .name=L"str", .long_arg=false},
|
|
@@ -135,9 +170,8 @@ ResultType file_write(O_FUNC){
|
|
LinkValue *file;
|
|
LinkValue *file;
|
|
setResultCore(result);
|
|
setResultCore(result);
|
|
parserArgumentUnion(ap, arg, CNEXT_NT);
|
|
parserArgumentUnion(ap, arg, CNEXT_NT);
|
|
- if (!CHECK_RESULT(result)) {
|
|
|
|
|
|
+ if (!CHECK_RESULT(result))
|
|
return result->type;
|
|
return result->type;
|
|
- }
|
|
|
|
freeResult(result);
|
|
freeResult(result);
|
|
|
|
|
|
if ((file = ap[0].value)->value->type != V_file || file->value->data.file.file == NULL) {
|
|
if ((file = ap[0].value)->value->type != V_file || file->value->data.file.file == NULL) {
|
|
@@ -150,11 +184,127 @@ ResultType file_write(O_FUNC){
|
|
return R_error;
|
|
return R_error;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ fseek(file->value->data.file.file, 0L, 1); // 改变文件状态(什么都没做)
|
|
fprintf(file->value->data.file.file, "%ls", ap[1].value->value->data.str.str);
|
|
fprintf(file->value->data.file.file, "%ls", ap[1].value->value->data.str.str);
|
|
setResult(result, inter);
|
|
setResult(result, inter);
|
|
return result->type;
|
|
return result->type;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+ResultType file_get_seek(O_FUNC){
|
|
|
|
+ ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
|
|
|
|
+ {.must=-1}};
|
|
|
|
+ LinkValue *file;
|
|
|
|
+ long seek;
|
|
|
|
+ setResultCore(result);
|
|
|
|
+ parserArgumentUnion(ap, arg, CNEXT_NT);
|
|
|
|
+ if (!CHECK_RESULT(result))
|
|
|
|
+ return result->type;
|
|
|
|
+ freeResult(result);
|
|
|
|
+
|
|
|
|
+ if ((file = ap[0].value)->value->type != V_file || file->value->data.file.file == NULL) {
|
|
|
|
+ setResultError(E_TypeException, INSTANCE_ERROR(file), LINEFILE, true, CNEXT_NT);
|
|
|
|
+ return R_error;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ seek = ftell(file->value->data.file.file);
|
|
|
|
+ makeIntValue(seek, LINEFILE, CNEXT_NT);
|
|
|
|
+ return result->type;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ResultType file_err_core(O_FUNC, int type){
|
|
|
|
+ ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
|
|
|
|
+ {.must=-1}};
|
|
|
|
+ LinkValue *file;
|
|
|
|
+ setResultCore(result);
|
|
|
|
+ parserArgumentUnion(ap, arg, CNEXT_NT);
|
|
|
|
+ if (!CHECK_RESULT(result))
|
|
|
|
+ return result->type;
|
|
|
|
+ freeResult(result);
|
|
|
|
+
|
|
|
|
+ if ((file = ap[0].value)->value->type != V_file || file->value->data.file.file == NULL) {
|
|
|
|
+ setResultError(E_TypeException, INSTANCE_ERROR(file), LINEFILE, true, CNEXT_NT);
|
|
|
|
+ return R_error;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ switch (type) {
|
|
|
|
+ case 1:
|
|
|
|
+ makeBoolValue(feof(file->value->data.file.file), LINEFILE, CNEXT_NT);
|
|
|
|
+ break;
|
|
|
|
+ case 2:
|
|
|
|
+ makeBoolValue(ferror(file->value->data.file.file), LINEFILE, CNEXT_NT);
|
|
|
|
+ break;
|
|
|
|
+ case 3:
|
|
|
|
+ clearerr(file->value->data.file.file);
|
|
|
|
+ default:
|
|
|
|
+ setResult(result, inter);
|
|
|
|
+ break;
|
|
|
|
+ }
|
|
|
|
+ return result->type;
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ResultType file_isend(O_FUNC){
|
|
|
|
+ return file_err_core(CO_FUNC(arg, var_list, result, belong), 1);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ResultType file_iserr(O_FUNC){
|
|
|
|
+ return file_err_core(CO_FUNC(arg, var_list, result, belong), 2);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ResultType file_clean_err(O_FUNC){
|
|
|
|
+ return file_err_core(CO_FUNC(arg, var_list, result, belong), 3);
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+ResultType file_seek(O_FUNC){
|
|
|
|
+ ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
|
|
|
|
+ {.type=name_value, .must=1, .name=L"seek", .long_arg=false},
|
|
|
|
+ {.type=name_value, .must=0, .name=L"where", .long_arg=false},
|
|
|
|
+ {.must=-1}};
|
|
|
|
+ LinkValue *file;
|
|
|
|
+ int where;
|
|
|
|
+ setResultCore(result);
|
|
|
|
+ parserArgumentUnion(ap, arg, CNEXT_NT);
|
|
|
|
+ if (!CHECK_RESULT(result))
|
|
|
|
+ return result->type;
|
|
|
|
+ freeResult(result);
|
|
|
|
+
|
|
|
|
+ if ((file = ap[0].value)->value->type != V_file || file->value->data.file.file == NULL) {
|
|
|
|
+ setResultError(E_TypeException, INSTANCE_ERROR(file), LINEFILE, true, CNEXT_NT);
|
|
|
|
+ return R_error;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (ap[1].value->value->type != V_int) {
|
|
|
|
+ setResultError(E_TypeException, ONLY_ACC(seek, int), LINEFILE, true, CNEXT_NT);
|
|
|
|
+ return R_error;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (ap[2].value != NULL) {
|
|
|
|
+ if (ap[2].value->value->type != V_int) {
|
|
|
|
+ setResultError(E_TypeException, ONLY_ACC(where, int), LINEFILE, true, CNEXT_NT);
|
|
|
|
+ return R_error;
|
|
|
|
+ }
|
|
|
|
+ switch (ap[2].value->value->data.int_.num) {
|
|
|
|
+ case 0:
|
|
|
|
+ where = SEEK_SET;
|
|
|
|
+ break;
|
|
|
|
+ case 1:
|
|
|
|
+ where = SEEK_CUR;
|
|
|
|
+ break;
|
|
|
|
+ case 2:
|
|
|
|
+ where = SEEK_END;
|
|
|
|
+ break;
|
|
|
|
+ default:
|
|
|
|
+ setResultError(E_TypeException, ONLY_ACC(where, (int)0/1/2), LINEFILE, true, CNEXT_NT);
|
|
|
|
+ return R_error;
|
|
|
|
+ }
|
|
|
|
+ } else
|
|
|
|
+ where = SEEK_SET;
|
|
|
|
+
|
|
|
|
+ fgetwc(file->value->data.file.file); // 必须先读取一个字节才可以调用seek
|
|
|
|
+ fseek(file->value->data.file.file, ap[1].value->value->data.int_.num, where);
|
|
|
|
+ setResult(result, inter);
|
|
|
|
+ return result->type;
|
|
|
|
+}
|
|
|
|
+
|
|
ResultType file_close(O_FUNC){
|
|
ResultType file_close(O_FUNC){
|
|
ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
|
|
ArgumentParser ap[] = {{.type=only_value, .must=1, .long_arg=false},
|
|
{.must=-1}};
|
|
{.must=-1}};
|
|
@@ -207,6 +357,12 @@ void registeredFile(R_FUNC){
|
|
NameFunc tmp[] = {{L"read", file_read, object_free_},
|
|
NameFunc tmp[] = {{L"read", file_read, object_free_},
|
|
{L"write", file_write, object_free_},
|
|
{L"write", file_write, object_free_},
|
|
{L"close", file_close, object_free_},
|
|
{L"close", file_close, object_free_},
|
|
|
|
+ {L"get_seek", file_get_seek, object_free_},
|
|
|
|
+ {L"seek", file_seek, object_free_},
|
|
|
|
+ {L"readline", file_readline, object_free_},
|
|
|
|
+ {L"end", file_isend, object_free_},
|
|
|
|
+ {L"err", file_iserr, object_free_},
|
|
|
|
+ {L"clean", file_clean_err, object_free_},
|
|
{inter->data.mag_func[M_ENTER], file_enter, object_free_},
|
|
{inter->data.mag_func[M_ENTER], file_enter, object_free_},
|
|
{inter->data.mag_func[M_DEL], file_close, object_free_},
|
|
{inter->data.mag_func[M_DEL], file_close, object_free_},
|
|
{inter->data.mag_func[M_EXIT], file_close, object_free_},
|
|
{inter->data.mag_func[M_EXIT], file_close, object_free_},
|