Make build.sh work evan with no arguments
[minish.git] / Devember / log17.txt
blob8c2568b627ffae2488ecd89d52dbfc792254f6fc
1 I am finding designing minish-eval properly to be hard.
3 The command substitution feature makes the task inherently recursive,
4 so I could decide to use a recursive function.
5 This function returns a file descriptor.
6 The function iterates the strings in argv, building an array.
7 When it finds an open parenthesis, it calls itself recursively,
8 thus beginning to build a new array.
9 Using getdelim() with ␀,
10 it reads from the return value and adds the strings to the array.
11 After there is no more to read, it continues iterating on argv.
12 When it finds a close parenthesis, it open a pipe and fork()s:
13 the child dup2()s its output to the writing end of the pipe,
14 adds NULL to the array, and calls execv();
15 the parent deletes the array and its contents
16 and returns the reading end of the pipe.
17 It seems sensible to avoid a deep copy of the strings in argv,
18 and simply have the array element point to them,
19 but those cannot be free()d and the ones returned by getdelim() do.
20 We would need some way to keep track of what to free().
22 Another approach is to avoid a recursive function,
23 but have a child of minish-eval execv() into minish-eval itself.
24 minish-eval iterates the strings in argv, building an array.
25 When it finds an open parenthesis,
26 it searches for the matching close parenthesis,
27 open a pipe and fork()s:
28 the child dup2()s its output to the writing end of the pipe,
29 copies what is inside the parentheses into another array,
30 adds NULL to it, and calls execv();
31 the parent reads from the pipe using getdelim() with ␀,
32 adding the strings to the array.
33 After there is no more to read, it continues iterating on argv.
34 The array that stores the command to be substituted
35 does not need to be deleted, because it is created by the child.
37 Enough for today.
39 Suggested reading:
40 https://en.wikipedia.org/wiki/Copy-on-write