protect atoms in SWI interface.
This commit is contained in:
parent
f2dc53a53e
commit
db619fa81f
22
C/pl-yap.c
22
C/pl-yap.c
@ -293,39 +293,43 @@ _PL_unify_string(term_t t, word w)
|
|||||||
|
|
||||||
word lookupAtom(const char *s, size_t len)
|
word lookupAtom(const char *s, size_t len)
|
||||||
{
|
{
|
||||||
|
YAP_Atom at;
|
||||||
|
|
||||||
/* dirty trick to ensure s is null terminated */
|
/* dirty trick to ensure s is null terminated */
|
||||||
char *st = (char *)s;
|
char *st = (char *)s;
|
||||||
st[len] = '\0';
|
st[len] = '\0';
|
||||||
if (len >= strlen(s)) {
|
if (len >= strlen(s)) {
|
||||||
return (word)YAP_LookupAtom(s);
|
at = YAP_LookupAtom(st);
|
||||||
} else {
|
} else {
|
||||||
char * buf = PL_malloc(len+1);
|
char * buf = PL_malloc(len+1);
|
||||||
word out;
|
|
||||||
|
|
||||||
if (!buf)
|
if (!buf)
|
||||||
return 0;
|
return 0;
|
||||||
strncpy(buf,s,len);
|
strncpy(buf,s,len);
|
||||||
out = (word)YAP_LookupAtom(buf);
|
at = YAP_LookupAtom(buf);
|
||||||
PL_free(buf);
|
PL_free(buf);
|
||||||
return out;
|
}
|
||||||
}
|
Yap_AtomIncreaseHold(at);
|
||||||
|
return (word)at;
|
||||||
}
|
}
|
||||||
|
|
||||||
atom_t lookupUCSAtom(const pl_wchar_t *s, size_t len)
|
atom_t lookupUCSAtom(const pl_wchar_t *s, size_t len)
|
||||||
{
|
{
|
||||||
|
YAP_Atom at;
|
||||||
|
|
||||||
if (len >= wcslen(s)) {
|
if (len >= wcslen(s)) {
|
||||||
return (atom_t)YAP_LookupWideAtom(s);
|
at = YAP_LookupWideAtom(s);
|
||||||
} else {
|
} else {
|
||||||
pl_wchar_t * buf = PL_malloc((len+1)*sizeof(pl_wchar_t));
|
pl_wchar_t * buf = PL_malloc((len+1)*sizeof(pl_wchar_t));
|
||||||
word out;
|
|
||||||
|
|
||||||
if (!buf)
|
if (!buf)
|
||||||
return 0;
|
return 0;
|
||||||
wcsncpy(buf,s,len);
|
wcsncpy(buf,s,len);
|
||||||
out = (word)YAP_LookupWideAtom(buf);
|
at = YAP_LookupWideAtom(buf);
|
||||||
PL_free(buf);
|
PL_free(buf);
|
||||||
return out;
|
|
||||||
}
|
}
|
||||||
|
Yap_AtomIncreaseHold(at);
|
||||||
|
return (atom_t)at;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -682,6 +682,7 @@ X_API atom_t PL_new_atom_wchars(size_t len, const wchar_t *c)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
at = AtomToSWIAtom(at0);
|
at = AtomToSWIAtom(at0);
|
||||||
|
Yap_AtomIncreaseHold(at0);
|
||||||
YAP_FreeSpaceFromYap(nbf);
|
YAP_FreeSpaceFromYap(nbf);
|
||||||
} else {
|
} else {
|
||||||
char *nbf;
|
char *nbf;
|
||||||
@ -704,8 +705,8 @@ X_API atom_t PL_new_atom_wchars(size_t len, const wchar_t *c)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Yap_AtomIncreaseHold(at0);
|
|
||||||
at = AtomToSWIAtom(at0);
|
at = AtomToSWIAtom(at0);
|
||||||
|
Yap_AtomIncreaseHold(at0);
|
||||||
YAP_FreeSpaceFromYap(nbf);
|
YAP_FreeSpaceFromYap(nbf);
|
||||||
}
|
}
|
||||||
return at;
|
return at;
|
||||||
@ -1099,8 +1100,8 @@ X_API int PL_unify_atom_nchars(term_t t, size_t len, const char *s)
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Yap_AtomIncreaseHold(catom);
|
|
||||||
free(buf);
|
free(buf);
|
||||||
|
Yap_AtomIncreaseHold(catom);
|
||||||
cterm = MkAtomTerm(catom);
|
cterm = MkAtomTerm(catom);
|
||||||
return YAP_Unify(Yap_GetFromSlot(t PASS_REGS),cterm);
|
return YAP_Unify(Yap_GetFromSlot(t PASS_REGS),cterm);
|
||||||
}
|
}
|
||||||
@ -1337,6 +1338,7 @@ X_API int PL_unify_wchars(term_t t, int type, size_t len, const pl_wchar_t *char
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Yap_AtomIncreaseHold(at);
|
||||||
chterm = MkAtomTerm(at);
|
chterm = MkAtomTerm(at);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -1418,6 +1420,7 @@ LookupMaxWideAtom(size_t n, wchar_t *s)
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Yap_AtomIncreaseHold(catom);
|
||||||
Yap_FreeAtomSpace((ADDR)buf);
|
Yap_FreeAtomSpace((ADDR)buf);
|
||||||
return catom;
|
return catom;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user