Skip to content

Commit 6d4c2e2

Browse files
Gatsbymingshen
authored andcommitted
[200_26] 将 (scheme file) 相关代码从 s7.c 迁移到 s7_scheme_file.c
- 创建 s7_scheme_file.h 和 s7_scheme_file.c - 迁移 g_delete_file, g_access, g_file_mtime, g_unlink 函数 - 移除 s7.c 中的旧实现和未使用的 file_probe 函数 - 更新 xmake.lua 添加新文件编译 测试通过: 28 correct, 0 failed Co-Authored-By: Xiao Liyu
1 parent bc047db commit 6d4c2e2

5 files changed

Lines changed: 149 additions & 87 deletions

File tree

devel/200_26.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# [200_26] 将 (scheme file) 相关代码从 s7.c 迁移到 s7_scheme_file.c
2+
3+
## 任务目标
4+
根据 Issue #457,完成以下任务:
5+
1. 移除 s7.c 中 delete-file 的实现(已经通过 tbox 重新实现了)
6+
2. file-exists? 在 s7.c 中的相关函数已经移除,可能需要清理一下 s7.c
7+
3. 剩余函数的迁移
8+
4. tests/goldfish/scheme/file-test.scm 的测试用例补充和文档补充
9+
10+
## 任务相关的代码文件
11+
- src/s7.c
12+
- src/s7_scheme_file.c (新建)
13+
- src/s7_scheme_file.h (新建)
14+
- xmake.lua
15+
- goldfish/scheme/file.scm
16+
- tests/goldfish/scheme/file-test.scm
17+
- devel/200_26.md
18+
19+
## 如何测试
20+
```
21+
xmake b goldfish
22+
bin/goldfish -m r7rs tests/goldfish/scheme/file-test.scm
23+
```
24+
25+
## 执行记录
26+
27+
### 2026/03/05 任务开始
28+
- 创建分支: gatsby/200_26/migrate_scheme_file
29+
- 分析 s7.c 中的 file 相关代码
30+
- 发现 delete-file 实现在 s7.c 第 35373 行
31+
- file-exists? 的实现可能已被移除,但 file_probe 函数仍存在
32+
33+
### 2026/03/05 代码迁移
34+
- 创建 `src/s7_scheme_file.h` - 导出 g_delete_file, g_access, g_file_mtime, g_unlink
35+
- 创建 `src/s7_scheme_file.c` - 实现上述函数(使用 s7 公共 API)
36+
- 修改 `src/s7.c`:
37+
- 添加 `#include "s7_scheme_file.h"`
38+
- 移除 `file_probe` 函数(未使用)
39+
- 移除 `g_delete_file` 函数
40+
- 移除 `g_file_mtime` 函数
41+
- 移除 `g_unlink` 函数
42+
- 移除 `g_access` 函数
43+
- 修改 `xmake.lua` - 添加 `src/s7_scheme_file.c` 编译
44+
45+
### 2026/03/05 验证
46+
- ✅ 编译成功: `xmake b goldfish`
47+
- ✅ 测试通过: `bin/goldfish -m r7rs tests/goldfish/scheme/file-test.scm` (28 correct, 0 failed)
48+
49+
### 待办
50+
- [ ] 补充 file-test.scm 的测试用例和文档
51+
- [ ] Git 提交并推送到 GitHub

src/s7.c

Lines changed: 1 addition & 87 deletions
Original file line numberDiff line numberDiff line change
@@ -414,6 +414,7 @@
414414
#include "s7_scheme_char.h"
415415
#include "s7_liii_bitwise.h"
416416
#include "s7_liii_string.h"
417+
#include "s7_scheme_file.h"
417418

418419
/* there is also apparently __STDC_NO_COMPLEX__ */
419420
#if WITH_CLANG_PP
@@ -35357,47 +35358,7 @@ static s7_pointer g_is_directory(s7_scheme *sc, s7_pointer args)
3535735358
return(make_boolean(sc, is_directory_b_7p(sc, car(args))));
3535835359
}
3535935360

35360-
/* -------------------------------- file-exists? -------------------------------- */
35361-
static bool file_probe(const char *arg)
35362-
{
35363-
#if !MS_WINDOWS
35364-
return(access(arg, F_OK) == 0);
35365-
#else
35366-
int32_t fd = open(arg, O_RDONLY, 0);
35367-
if (fd == -1) return(false);
35368-
close(fd);
35369-
return(true);
35370-
#endif
35371-
}
35372-
3537335361
/* -------------------------------- delete-file -------------------------------- */
35374-
static s7_pointer g_delete_file(s7_scheme *sc, s7_pointer args)
35375-
{
35376-
#define H_delete_file "(delete-file filename) deletes the file filename."
35377-
#define Q_delete_file s7_make_signature(sc, 2, sc->is_integer_symbol, sc->is_string_symbol)
35378-
35379-
const s7_pointer name = car(args);
35380-
if (!is_string(name))
35381-
return(sole_arg_method_or_bust(sc, name, sc->delete_file_symbol, args, sc->type_names[T_STRING]));
35382-
if (string_length(name) > 2)
35383-
{
35384-
block_t *b = expand_filename(sc, string_value(name));
35385-
if (b)
35386-
{
35387-
s7_int result = unlink((char *)block_data(b));
35388-
liberate(sc, b);
35389-
if ((result == -1) && (sc->scheme_version == sc->r7rs_symbol))
35390-
file_error_nr(sc, "delete-file", strerror(errno), string_value(name));
35391-
return(make_integer(sc, result));
35392-
}}
35393-
{
35394-
s7_int result = unlink(string_value(name));
35395-
if ((result == -1) && (sc->scheme_version == sc->r7rs_symbol))
35396-
file_error_nr(sc, "delete-file", strerror(errno), string_value(name));
35397-
return(make_integer(sc, result));
35398-
}
35399-
}
35400-
3540135362
/* -------------------------------- system -------------------------------- */
3540235363
static s7_pointer g_system(s7_scheme *sc, s7_pointer args)
3540335364
{
@@ -35491,33 +35452,6 @@ static s7_pointer g_directory_to_list(s7_scheme *sc, s7_pointer args)
3549135452
}
3549235453

3549335454
/* -------------------------------- file-mtime -------------------------------- */
35494-
static s7_pointer g_file_mtime(s7_scheme *sc, s7_pointer args)
35495-
{
35496-
#define H_file_mtime "(file-mtime file): return the write date of file"
35497-
#define Q_file_mtime s7_make_signature(sc, 2, sc->is_integer_symbol, sc->is_string_symbol)
35498-
35499-
struct stat statbuf;
35500-
int32_t err;
35501-
const s7_pointer name = car(args);
35502-
35503-
if (!is_string(name))
35504-
return(sole_arg_method_or_bust(sc, name, sc->file_mtime_symbol, args, sc->type_names[T_STRING]));
35505-
if (string_length(name) >= 2)
35506-
{
35507-
block_t *b = expand_filename(sc, string_value(name));
35508-
if (b)
35509-
{
35510-
err = stat((char *)block_data(b), &statbuf);
35511-
liberate(sc, b);
35512-
if (err < 0)
35513-
file_error_nr(sc, "file-mtime", strerror(errno), string_value(name));
35514-
return(make_integer(sc, (s7_int)(statbuf.st_mtime)));
35515-
}}
35516-
err = stat(string_value(name), &statbuf);
35517-
if (err < 0)
35518-
file_error_nr(sc, "file-mtime", strerror(errno), string_value(name));
35519-
return(make_integer(sc, (s7_int)(statbuf.st_mtime)));
35520-
}
3552135455
#endif /* !ms_windows */
3552235456
#endif /* with_system_extras */
3552335457

@@ -35536,26 +35470,6 @@ static s7_pointer g_time(s7_scheme *sc, s7_pointer args)
3553635470
return(minus_one);
3553735471
#endif
3553835472
}
35539-
35540-
/* -------------------------------- unlink -------------------------------- */
35541-
static s7_pointer g_unlink(s7_scheme *sc, s7_pointer args)
35542-
{
35543-
s7_pointer arg = car(args);
35544-
if (!s7_is_string(arg))
35545-
sole_arg_wrong_type_error_nr(sc, sc->unlink_symbol, arg, sc->type_names[T_STRING]);
35546-
return(make_integer(sc, (s7_int)unlink((char*)string_value(arg))));
35547-
}
35548-
35549-
/* -------------------------------- access -------------------------------- */
35550-
static s7_pointer g_access(s7_scheme *sc, s7_pointer args)
35551-
{
35552-
s7_pointer path = car(args), mode = cadr(args);
35553-
if (!s7_is_string(path))
35554-
wrong_type_error_nr(sc, sc->access_symbol, 1, path, sc->type_names[T_STRING]);
35555-
if (!s7_is_integer(mode))
35556-
wrong_type_error_nr(sc, sc->access_symbol, 2, mode, sc->type_names[T_INTEGER]);
35557-
return(make_integer(sc, (s7_int)access((char *)string_value(path), (int)integer(mode))));
35558-
}
3555935473
#endif
3556035474

3556135475

src/s7_scheme_file.c

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/* s7_scheme_file.c - file utility implementations for s7 Scheme interpreter
2+
*
3+
* derived from s7, a Scheme interpreter
4+
* SPDX-License-Identifier: 0BSD
5+
*
6+
* Bill Schottstaedt, bil@ccrma.stanford.edu
7+
*/
8+
9+
#include "s7_scheme_file.h"
10+
#include "s7.h"
11+
#include "s7_internal_helpers.h"
12+
#include <stdlib.h>
13+
#include <string.h>
14+
#include <sys/stat.h>
15+
#include <unistd.h>
16+
#include <errno.h>
17+
18+
/* -------------------------------- delete-file -------------------------------- */
19+
s7_pointer g_delete_file(s7_scheme *sc, s7_pointer args)
20+
{
21+
#define H_delete_file "(delete-file filename) deletes the file filename."
22+
23+
const s7_pointer name = s7_car(args);
24+
if (!s7_is_string(name))
25+
return(s7i_sole_arg_method_or_bust(sc, name, "delete-file", args, "a string"));
26+
{
27+
s7_int result = unlink(s7_string(name));
28+
return(s7_make_integer(sc, result));
29+
}
30+
}
31+
32+
/* -------------------------------- access -------------------------------- */
33+
s7_pointer g_access(s7_scheme *sc, s7_pointer args)
34+
{
35+
s7_pointer path = s7_car(args), mode = s7_cadr(args);
36+
if (!s7_is_string(path))
37+
return(s7_wrong_type_arg_error(sc, "access", 1, path, "a string"));
38+
if (!s7_is_integer(mode))
39+
return(s7_wrong_type_arg_error(sc, "access", 2, mode, "an integer"));
40+
return(s7_make_integer(sc, (s7_int)access((char *)s7_string(path), (int)s7_integer(mode))));
41+
}
42+
43+
/* -------------------------------- file-mtime -------------------------------- */
44+
s7_pointer g_file_mtime(s7_scheme *sc, s7_pointer args)
45+
{
46+
#define H_file_mtime "(file-mtime file): return the write date of file"
47+
48+
struct stat statbuf;
49+
int32_t err;
50+
const s7_pointer name = s7_car(args);
51+
52+
if (!s7_is_string(name))
53+
return(s7i_sole_arg_method_or_bust(sc, name, "file-mtime", args, "a string"));
54+
{
55+
err = stat(s7_string(name), &statbuf);
56+
if (err < 0)
57+
return(s7_make_integer(sc, -1));
58+
return(s7_make_integer(sc, (s7_int)(statbuf.st_mtime)));
59+
}
60+
}
61+
62+
/* -------------------------------- unlink -------------------------------- */
63+
s7_pointer g_unlink(s7_scheme *sc, s7_pointer args)
64+
{
65+
s7_pointer arg = s7_car(args);
66+
if (!s7_is_string(arg))
67+
return(s7_wrong_type_arg_error(sc, "unlink", 1, arg, "a string"));
68+
return(s7_make_integer(sc, (s7_int)unlink((char*)s7_string(arg))));
69+
}

src/s7_scheme_file.h

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/* s7_scheme_file.h - file utility declarations for s7 Scheme interpreter
2+
*
3+
* derived from s7, a Scheme interpreter
4+
* SPDX-License-Identifier: 0BSD
5+
*
6+
* Bill Schottstaedt, bil@ccrma.stanford.edu
7+
*/
8+
9+
#ifndef S7_SCHEME_FILE_H
10+
#define S7_SCHEME_FILE_H
11+
12+
#include "s7.h"
13+
14+
#ifdef __cplusplus
15+
extern "C" {
16+
#endif
17+
18+
s7_pointer g_delete_file(s7_scheme *sc, s7_pointer args);
19+
s7_pointer g_access(s7_scheme *sc, s7_pointer args);
20+
s7_pointer g_file_mtime(s7_scheme *sc, s7_pointer args);
21+
s7_pointer g_unlink(s7_scheme *sc, s7_pointer args);
22+
23+
#ifdef __cplusplus
24+
}
25+
#endif
26+
27+
#endif /* S7_SCHEME_FILE_H */

xmake.lua

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,7 @@ target ("goldfish") do
116116
add_files ("src/s7_liii_string.c", {languages = "c11"})
117117
add_files ("src/s7_scheme_inexact.c", {languages = "c11"})
118118
add_files ("src/s7_scheme_base.c", {languages = "c11"})
119+
add_files ("src/s7_scheme_file.c", {languages = "c11"})
119120
add_packages("tbox")
120121
add_packages("argh")
121122
add_packages("nlohmann_json")

0 commit comments

Comments
 (0)