No, not nearly all of it -- I have 3200 LOC on top of a 6700 kB library. But those functions, together with 'glue code' for the library, can be compiled into the core application of the Pari library, called GP. So these functions provide stand-alone functionality.
Well, actually that's not true. They are called via this function:
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;
}
which is itself called by GP. But I thought those functions could be understood in isolation.
Overview:
- GP is a programmable calculator; C functions can be exposed directly to the users.
- Anything marked "GEN" is a bignum object that interacts with the Pari library.
- GEN bfile(GEN, GEN, GEN) can be called by the user with input. It turns the first argument into a filename ("file.txt" -> "file.txt"; 123456 -> "b123456.txt"; 40 -> "b000040.txt"). If the latter two arguments are NULL (in this case, this means the user sent only one argument to the function through GP), then GEN bfile (char*) is called. (The file is first checked to make sure it exists.) Otherwise, this function creates a file at that location and outputs data to it.
- GEN bfile(char*) takes a filename, opens the file, and reads in the data, storing it to a GEN object it will pass back to GP