else if (ss_match_char (&src, '{'))
ss_get_until (&src, '}', &var_name);
else
- ss_get_chars (&src, MIN (1, ss_span (src, ss_cstr (CC_ALNUM))),
+ ss_get_chars (&src, MAX (1, ss_span (src, ss_cstr (CC_ALNUM))),
&var_name);
start = ds_length (&dst);
FILE *
fn_open (const char *fn, const char *mode)
{
- assert (mode[0] == 'r' || mode[0] == 'w');
+ assert (mode[0] == 'r' || mode[0] == 'w' || mode[0] == 'a');
if (mode[0] == 'r' && (!strcmp (fn, "stdin") || !strcmp (fn, "-")))
return stdin;
if (get_safer_mode ())
return safety_violation (fn);
- return popen (&fn[1], mode);
+ return popen (&fn[1], mode[0] == 'r' ? "r" : "w");
}
else if (*fn && fn[strlen (fn) - 1] == '|')
{
memcpy (s, fn, strlen (fn) - 1);
s[strlen (fn) - 1] = 0;
- f = popen (s, mode);
+ f = popen (s, mode[0] == 'r' ? "r" : "w");
local_free (s);
int
fn_close (const char *fn, FILE *f)
{
- if (!strcmp (fn, "-"))
+ if (fileno (f) == STDIN_FILENO
+ || fileno (f) == STDOUT_FILENO
+ || fileno (f) == STDERR_FILENO)
return 0;
#if HAVE_POPEN
else if (fn[0] == '|' || (*fn && fn[strlen (fn) - 1] == '|'))