Bill Allombert on Tue, 27 Sep 2005 15:17:42 +0200 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
gp_readvec_file |
Hello PARI-dev, Here a patch to read files containing several PARI objects and put them in a vector. For example if your file contain 1 [1,2,3] I 2.333 you will get [1,[1,2,3],I,2.333]. (To use: install("gp_readvec_file","s"); ) I wrote it because I though this was faster than reading the same file with [] and , added. Apparently it is only 38% faster, but it is certainly more convenient to use. When you read large files, it is a good idea to turn "simplify" off (\y). "simplify" can waste quite a lot of time/memory. Cheers, Bill. Index: pari/src/language/es.c =================================================================== --- pari.orig/src/language/es.c 2005-09-24 15:32:00.000000000 +0200 +++ pari/src/language/es.c 2005-09-24 16:54:46.000000000 +0200 @@ -247,6 +247,42 @@ popinfile(); return x; } +GEN +gp_readvec_stream(FILE *fi) +{ + pari_sp ltop=avma; + Buffer *b = new_buffer(); + long i=1, n=16; + GEN z=cgetg(n+1,t_VEC); + for(;;) + { + if (!gp_read_stream_buf(fi, b)) break; + if (!*(b->buf)) continue; + if (i>n) + { + if (DEBUGLEVEL) + fprintferr("gp_readvec_stream: reaching %ld entries\n",n); + n<<=1; + z=vec_lengthen(z,n); + } + gel(z,i++) = readseq(b->buf); + } + if (DEBUGLEVEL) + fprintferr("gp_readvec_stream: found %ld entries\n",i-1); + delete_buffer(b); + setlg(z,i); + return gerepilecopy(ltop,z); +} + +GEN +gp_readvec_file(char *s) +{ + GEN x; + switchin(s); + x=gp_readvec_stream(infile); + popinfile(); return x; +} + /* Read from file (up to '\n' or EOF) and copy at s0 (points in b->buf) */ char * file_input(char **s0, int junk, input_method *IM, filtre_t *F)