string_to_atom/2.
This commit is contained in:
parent
1d2cad4545
commit
2aa76a546c
111
C/stdpreds.c
111
C/stdpreds.c
@ -1065,6 +1065,116 @@ p_name( USES_REGS1 )
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Int
|
||||||
|
p_string_to_atom( USES_REGS1 )
|
||||||
|
{ /* name(?Atomic,?String) */
|
||||||
|
char *String; /* alloc temp space on trail */
|
||||||
|
Term t = Deref(ARG1), NewT, AtomNameT = Deref(ARG2);
|
||||||
|
|
||||||
|
restart_aux:
|
||||||
|
if (!IsVarTerm(t)) {
|
||||||
|
Atom at;
|
||||||
|
do {
|
||||||
|
if (Yap_IsWideStringTerm(t)) {
|
||||||
|
at = Yap_LookupWideAtom(Yap_BlobWideStringOfTerm(t));
|
||||||
|
} else if (Yap_IsStringTerm(t)) {
|
||||||
|
at = Yap_LookupAtom(Yap_BlobStringOfTerm(t));
|
||||||
|
} else if (IsAtomTerm(t)) {
|
||||||
|
return Yap_unify(t, ARG2);
|
||||||
|
} else if (IsIntTerm(t)) {
|
||||||
|
char *String = Yap_PreAllocCodeSpace();
|
||||||
|
if (String + 1024 > (char *)AuxSp)
|
||||||
|
goto expand_auxsp;
|
||||||
|
sprintf(String, Int_FORMAT, IntOfTerm(t));
|
||||||
|
at = Yap_LookupAtom(String);
|
||||||
|
} else if (IsFloatTerm(t)) {
|
||||||
|
char *String = Yap_PreAllocCodeSpace();
|
||||||
|
if (String + 1024 > (char *)AuxSp)
|
||||||
|
goto expand_auxsp;
|
||||||
|
|
||||||
|
sprintf(String, "%f", FloatOfTerm(t));
|
||||||
|
at = Yap_LookupAtom(String);
|
||||||
|
} else if (IsLongIntTerm(t)) {
|
||||||
|
char *String = Yap_PreAllocCodeSpace();
|
||||||
|
if (String + 1024 > (char *)AuxSp)
|
||||||
|
goto expand_auxsp;
|
||||||
|
|
||||||
|
sprintf(String, Int_FORMAT, LongIntOfTerm(t));
|
||||||
|
at = Yap_LookupAtom(String);
|
||||||
|
#if USE_GMP
|
||||||
|
} else if (IsBigIntTerm(t)) {
|
||||||
|
String = Yap_PreAllocCodeSpace();
|
||||||
|
if (!Yap_gmp_to_string(t, String, ((char *)AuxSp-String)-1024, 10 ))
|
||||||
|
goto expand_auxsp;
|
||||||
|
at = Yap_LookupAtom(String);
|
||||||
|
#endif
|
||||||
|
} else {
|
||||||
|
Yap_Error(TYPE_ERROR_ATOMIC,AtomNameT,"name/2");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
if (at != NIL)
|
||||||
|
break;
|
||||||
|
if (!Yap_growheap(FALSE, 0, NULL)) {
|
||||||
|
Yap_Error(OUT_OF_HEAP_ERROR, ARG2, "generating atom from string in string_to_atom/2");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
t = Deref(ARG1);
|
||||||
|
} while(TRUE);
|
||||||
|
return Yap_unify_constant(ARG2, MkAtomTerm(at));
|
||||||
|
}
|
||||||
|
if (!IsVarTerm(AtomNameT)) {
|
||||||
|
if (IsAtomTerm(AtomNameT)) {
|
||||||
|
Atom at = AtomOfTerm(AtomNameT);
|
||||||
|
if (IsWideAtom(at)) {
|
||||||
|
wchar_t *s = RepAtom(at)->WStrOfAE;
|
||||||
|
NewT = Yap_MkBlobWideStringTerm(s, wcslen(s));
|
||||||
|
return Yap_unify(NewT, ARG1);
|
||||||
|
} else
|
||||||
|
String = RepAtom(at)->StrOfAE;
|
||||||
|
} else if (IsIntTerm(AtomNameT)) {
|
||||||
|
String = Yap_PreAllocCodeSpace();
|
||||||
|
if (String + 1024 > (char *)AuxSp)
|
||||||
|
goto expand_auxsp;
|
||||||
|
sprintf(String, Int_FORMAT, IntOfTerm(AtomNameT));
|
||||||
|
} else if (IsFloatTerm(AtomNameT)) {
|
||||||
|
String = Yap_PreAllocCodeSpace();
|
||||||
|
if (String + 1024 > (char *)AuxSp)
|
||||||
|
goto expand_auxsp;
|
||||||
|
|
||||||
|
sprintf(String, "%f", FloatOfTerm(AtomNameT));
|
||||||
|
} else if (IsLongIntTerm(AtomNameT)) {
|
||||||
|
String = Yap_PreAllocCodeSpace();
|
||||||
|
if (String + 1024 > (char *)AuxSp)
|
||||||
|
goto expand_auxsp;
|
||||||
|
|
||||||
|
sprintf(String, Int_FORMAT, LongIntOfTerm(AtomNameT));
|
||||||
|
#if USE_GMP
|
||||||
|
} else if (IsBigIntTerm(AtomNameT)) {
|
||||||
|
String = Yap_PreAllocCodeSpace();
|
||||||
|
if (!Yap_gmp_to_string(AtomNameT, String, ((char *)AuxSp-String)-1024, 10 ))
|
||||||
|
goto expand_auxsp;
|
||||||
|
#endif
|
||||||
|
NewT = Yap_MkBlobStringTerm(String, strlen(String));
|
||||||
|
return Yap_unify(NewT, ARG1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Yap_Error(INSTANTIATION_ERROR, ARG1, "string_to_atom/2");
|
||||||
|
return(FALSE);
|
||||||
|
|
||||||
|
/* error handling */
|
||||||
|
expand_auxsp:
|
||||||
|
String = Yap_ExpandPreAllocCodeSpace(0,NULL, TRUE);
|
||||||
|
if (String + 1024 > (char *)AuxSp) {
|
||||||
|
/* crash in flames */
|
||||||
|
Yap_Error(OUT_OF_AUXSPACE_ERROR, ARG1, "allocating temp space in string_to_atom/2");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
AtomNameT = Deref(ARG1);
|
||||||
|
t = Deref(ARG2);
|
||||||
|
goto restart_aux;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static Int
|
static Int
|
||||||
p_atom_chars( USES_REGS1 )
|
p_atom_chars( USES_REGS1 )
|
||||||
{
|
{
|
||||||
@ -4126,6 +4236,7 @@ Yap_InitCPreds(void)
|
|||||||
/* general purpose */
|
/* general purpose */
|
||||||
Yap_InitCPred("$opdec", 4, p_opdec, SafePredFlag|SyncPredFlag|HiddenPredFlag);
|
Yap_InitCPred("$opdec", 4, p_opdec, SafePredFlag|SyncPredFlag|HiddenPredFlag);
|
||||||
Yap_InitCPred("name", 2, p_name, 0);
|
Yap_InitCPred("name", 2, p_name, 0);
|
||||||
|
Yap_InitCPred("string_to_atom", 2, p_string_to_atom, 0);
|
||||||
Yap_InitCPred("char_code", 2, p_char_code, SafePredFlag);
|
Yap_InitCPred("char_code", 2, p_char_code, SafePredFlag);
|
||||||
Yap_InitCPred("atom_chars", 2, p_atom_chars, 0);
|
Yap_InitCPred("atom_chars", 2, p_atom_chars, 0);
|
||||||
Yap_InitCPred("atom_codes", 2, p_atom_codes, 0);
|
Yap_InitCPred("atom_codes", 2, p_atom_codes, 0);
|
||||||
|
Reference in New Issue
Block a user