Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download

Testing latest pari + WASM + node.js... and it works?! Wow.

28495 views
License: GPL3
ubuntu2004
1
/* Copyright (C) 2018 The PARI group.
2
3
This file is part of the PARI/GP package.
4
5
PARI/GP is free software; you can redistribute it and/or modify it under the
6
terms of the GNU General Public License as published by the Free Software
7
Foundation; either version 2 of the License, or (at your option) any later
8
version. It is distributed in the hope that it will be useful, but WITHOUT
9
ANY WARRANTY WHATSOEVER.
10
11
Check the License for details. You should have received a copy of it, along
12
with the package; see the file 'COPYING'. If not, write to the Free Software
13
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */
14
15
#include "pari.h"
16
#include "paripriv.h"
17
18
/********************************************************************/
19
/** **/
20
/** CHARACTER STRINGS **/
21
/** **/
22
/********************************************************************/
23
24
/* Utillity functions */
25
char *
26
stack_strdup(const char *s)
27
{
28
long n = strlen(s)+1;
29
char *t = stack_malloc(n);
30
memcpy(t,s,n); return t;
31
}
32
char *
33
stack_strcat(const char *s, const char *t)
34
{
35
long ls = strlen(s), lt = strlen(t);
36
long n = ls + lt + 1;
37
char *u = stack_malloc(n);
38
memcpy(u, s, ls);
39
memcpy(u + ls,t, lt+1); return u;
40
}
41
42
char *
43
pari_strdup(const char *s)
44
{
45
long n = strlen(s)+1;
46
char *t = (char*)pari_malloc(n);
47
memcpy(t,s,n); return t;
48
}
49
char *
50
pari_strndup(const char *s, long n)
51
{
52
char *t = (char*)pari_malloc(n+1);
53
memcpy(t,s,n); t[n] = 0; return t;
54
}
55
56
/* return the first n0 chars of s as a GEN [s may not be 0-terminated] */
57
GEN
58
strntoGENstr(const char *s, long n0)
59
{
60
long n = nchar2nlong(n0+1); /* +1 for trailing 0 */
61
GEN x = cgetg(n+1, t_STR);
62
char *t = GSTR(x);
63
x[n] = 0; /* avoid uninitialized memory */
64
strncpy(t, s, n0); t[n0] = 0; return x;
65
}
66
67
/* strntoGENstr would trigger gcc-8 stringop-truncation warning */
68
GEN
69
strtoGENstr(const char *s)
70
{
71
long n0 = strlen(s) + 1, n = nchar2nlong(n0);
72
GEN x = cgetg(n+1, t_STR);
73
char *t = GSTR(x);
74
x[n] = 0; strncpy(t, s, n0); return x;
75
}
76
77
GEN
78
chartoGENstr(char c)
79
{
80
GEN x = cgetg(2, t_STR);
81
char *t = GSTR(x);
82
t[0] = c; t[1] = 0; return x;
83
}
84
85
const char *
86
type_name(long t)
87
{
88
const char *s;
89
switch(t)
90
{
91
case t_INT : s="t_INT"; break;
92
case t_REAL : s="t_REAL"; break;
93
case t_INTMOD : s="t_INTMOD"; break;
94
case t_FRAC : s="t_FRAC"; break;
95
case t_FFELT : s="t_FFELT"; break;
96
case t_COMPLEX: s="t_COMPLEX"; break;
97
case t_PADIC : s="t_PADIC"; break;
98
case t_QUAD : s="t_QUAD"; break;
99
case t_POLMOD : s="t_POLMOD"; break;
100
case t_POL : s="t_POL"; break;
101
case t_SER : s="t_SER"; break;
102
case t_RFRAC : s="t_RFRAC"; break;
103
case t_QFB : s="t_QFB"; break;
104
case t_VEC : s="t_VEC"; break;
105
case t_COL : s="t_COL"; break;
106
case t_MAT : s="t_MAT"; break;
107
case t_LIST : s="t_LIST"; break;
108
case t_STR : s="t_STR"; break;
109
case t_VECSMALL:s="t_VECSMALL";break;
110
case t_CLOSURE: s="t_CLOSURE"; break;
111
case t_ERROR: s="t_ERROR"; break;
112
case t_INFINITY:s="t_INFINITY";break;
113
default: pari_err_BUG("type"); s = NULL; /* LCOV_EXCL_LINE */
114
}
115
return s;
116
}
117
118
GEN
119
type0(GEN x)
120
{
121
const char *s = type_name(typ(x));
122
return strtoGENstr(s);
123
}
124
125
static char
126
ltoc(long n) {
127
if (n <= 0 || n > 255)
128
pari_err(e_MISC, "out of range in integer -> character conversion (%ld)", n);
129
return (char)n;
130
}
131
static char
132
itoc(GEN x) { return ltoc(gtos(x)); }
133
134
GEN
135
pari_strchr(GEN g)
136
{
137
long i, l, len, t = typ(g);
138
char *s;
139
GEN x;
140
if (is_vec_t(t)) {
141
l = lg(g); len = nchar2nlong(l);
142
x = cgetg(len+1, t_STR); s = GSTR(x);
143
for (i=1; i<l; i++) *s++ = itoc(gel(g,i));
144
}
145
else if (t == t_VECSMALL)
146
{
147
l = lg(g); len = nchar2nlong(l);
148
x = cgetg(len+1, t_STR); s = GSTR(x);
149
for (i=1; i<l; i++) *s++ = ltoc(g[i]);
150
}
151
else
152
return chartoGENstr(itoc(g));
153
*s = 0; return x;
154
}
155
156
GEN
157
strsplit(GEN x, GEN p)
158
{
159
long i0, i, iv, ls, lt;
160
char *s, *t;
161
GEN v;
162
if (typ(x) != t_STR) pari_err_TYPE("strsplit",x);
163
s = GSTR(x); ls = strlen(s);
164
if (!p) lt = 0;
165
else
166
{
167
if (typ(p) != t_STR) pari_err_TYPE("strsplit",p);
168
t = GSTR(p); lt = strlen(t);
169
}
170
if (!lt) /* empty separator: split by char */
171
{
172
v = cgetg(ls+1, t_VEC);
173
for (i = 1; i <= ls; i++) gel(v,i) = chartoGENstr(s[i-1]);
174
return v;
175
}
176
v = cgetg(ls + 2, t_VEC); iv = 1;
177
for (i = i0 = 0; i < ls; i++)
178
while (!strncmp(s + i, t, lt))
179
{
180
gel(v, iv++) = strntoGENstr(s + i0, i - i0);
181
i += lt; i0 = i;
182
}
183
gel(v, iv++) = strntoGENstr(s + i0, i - i0);
184
stackdummy((pari_sp)(v + iv), (pari_sp)(v + ls + 2));
185
setlg(v, iv); return v;
186
}
187
188
GEN
189
strjoin(GEN v, GEN p)
190
{
191
pari_sp av = avma;
192
long i, l;
193
GEN w;
194
if (!is_vec_t(typ(v))) pari_err_TYPE("strjoin",v);
195
if (!p) p = strtoGENstr("");
196
if (typ(p) != t_STR) pari_err_TYPE("strjoin",p);
197
l = lg(v); if (l == 1) return strtoGENstr("");
198
w = cgetg(2*l - 2, t_VEC);
199
gel(w, 1) = gel(v, 1);
200
for (i = 2; i < l; i++)
201
{
202
gel(w, 2*i-2) = p;
203
gel(w, 2*i-1) = gel(v, i);
204
}
205
return gerepileuptoleaf(av, shallowconcat1(w));
206
}
207
208