Code:
GEN
bfile(GEN name, GEN v, GEN offset)
{
pari_sp ltop = avma;
GEN cur = gen_0, Anum = gen_0;
// If no v is given, fine; but if it is it must be a vector.
// Should this use is_vec_t(typ(v)) to allow t_COL as well?
if (v && typ(v) != t_VEC)
pari_err(typeer, "bfile");
if (!offset)
offset = gen_1;
else if (typ(offset) != t_INT)
pari_err(typeer, "bfile");
cur = subis(offset, 1);
if (typ(name) == t_INT)
{
name = gtovec(GENtoGENstr(name));
GEN p2;
while (glength(name) < 6)
{
p2 = cgetg(2, t_VEC);
gel(p2, 1) = strtoGENstr("0");
name = concat(p2, name);
}
Anum = concat(name, NULL); // "0","0","0","0","4","0" -> "000040"
name = concat(concat(strtoGENstr("b"), Anum), strtoGENstr(".txt"));
} else {
if (typ(name) != t_STR)
pari_err(typeer, "bfile");
// TODO: Try to extract a reasonable A-number, or just set to blank?
Anum = strtoGENstr("000000");
//Anum = concat(extract0(gtovec(name), stoi(126), NULL), NULL);
}
char* filename = GSTR(name);
if (!v)
return bfilein(filename);
FILE *f = fopen(filename, "r");
if (f)
pari_warn(warner, "File `%Ps' already exists. Appending terms..", name);
long l1 = lg(v);
pari_sp btop = avma, st_lim = stack_lim(btop, 1);
long i;
for (i = 1; i < l1; ++i)
{
GEN e = gel(v, i);
if (typ(e) != t_INT)
pari_err(typeer, "bfile");
if (cmpis(digits(e), 1000) > 0)
{
pari_warn(warner, "Next term has %Ps digits; exiting.\n", digits(e));
break;
}
write0(filename, mkvec3(cur = addis(cur, 1), strtoGENstr(" "), e));
if (low_stack(st_lim, stack_lim(btop, 1)))
cur = gerepilecopy(btop, cur);
}
pari_printf("%%H A%Ps Author, <a href=\"b%Ps.txt\">Table of n, a(n) for n = %Ps..%Ps</a>\n", Anum, Anum, offset, cur);
avma = ltop;
return gnil;
}