922
938
glob->ops= sp->ops;
941
void Y_symbol_exists(int argc)
943
if (argc != 1) YError("symbol_exists takes exactly one argument");
944
PushIntValue(HashFind(&globalTable, YGetString(sp), 0L));
951
#define GET_FUNCTION 16
952
#define GET_BUILTIN 32
953
#define GET_STRUCTDEF 64
954
#define GET_STREAM 128
955
#define GET_OPAQUE 256
957
#define GET_AUTOLOAD 1024
959
void Y_symbol_names(int argc)
961
extern Operations listOps;
962
long i, nitems, number;
964
int match[T_OPAQUE+1];
965
int type, flags, pass;
966
int omit_array, omit_list, omit_autoload, omit_opaque;
967
Dimension *dims = tmpDims;
969
tmpDims = (Dimension *)0;
970
if (dims != (Dimension *)0) FreeDimension(dims);
971
if (argc != 1) YError("symbol_list takes exactly one argument");
973
flags = YGetInteger(sp);
975
flags = (GET_ARRAY | GET_STRUCT | GET_RANGE | GET_FUNCTION | GET_BUILTIN |
976
GET_STRUCTDEF | GET_STREAM | GET_OPAQUE);
978
nitems = globalTable.nItems;
980
/* No symbols defined. */
981
PushDataBlock(RefNC(&nilDB));
985
/* Return names of all symbols ever defined. */
986
tmpDims = NewDimension(nitems, 1L, (Dimension *)0);
987
ret = ((Array *)PushDataBlock(NewArray(&stringStruct, tmpDims)))->value.q;
988
for (i = 0; i < nitems; ++i) {
989
ret[i] = p_strcpy(globalTable.names[i]);
993
omit_array = ((flags & GET_ARRAY) == 0);
994
omit_list = ((flags & GET_LIST) == 0);
995
omit_autoload = ((flags & GET_AUTOLOAD) == 0);
996
omit_opaque = ((flags & GET_OPAQUE) == 0);
997
if ((flags & (GET_LIST | GET_AUTOLOAD)) != 0) {
1000
for (i = 0; i <= T_OPAQUE; ++i) {
1003
match[T_CHAR] = ((flags & GET_ARRAY) != 0);
1004
match[T_SHORT] = ((flags & GET_ARRAY) != 0);
1005
match[T_INT] = ((flags & GET_ARRAY) != 0);
1006
match[T_LONG] = ((flags & GET_ARRAY) != 0);
1007
match[T_FLOAT] = ((flags & GET_ARRAY) != 0);
1008
match[T_DOUBLE] = ((flags & GET_ARRAY) != 0);
1009
match[T_COMPLEX] = ((flags & GET_ARRAY) != 0);
1010
match[T_STRING] = ((flags & GET_ARRAY) != 0);
1011
match[T_POINTER] = ((flags & GET_ARRAY) != 0);
1012
match[T_STRUCT] = ((flags & GET_STRUCT) != 0);
1013
match[T_RANGE] = ((flags & GET_RANGE) != 0);
1015
match[T_LVALUE] = ((flags & GET_LVALUE) != 0);
1017
match[T_VOID] = ((flags & GET_VOID) != 0);
1018
match[T_FUNCTION] = ((flags & GET_FUNCTION) != 0);
1019
match[T_BUILTIN] = ((flags & GET_BUILTIN) != 0);
1020
match[T_STRUCTDEF] = ((flags & GET_STRUCTDEF) != 0);
1021
match[T_STREAM] = ((flags & GET_STREAM) != 0);
1022
match[T_OPAQUE] = ((flags & GET_OPAQUE) != 0);
1024
/* Counter number of matching symbols. */
1025
ret = NULL; /* avoids compiler warning */
1027
for (pass = 0; pass <= 1; ++pass) {
1030
/* No matching symbols found. */
1031
PushDataBlock(RefNC(&nilDB));
1034
tmpDims = NewDimension(number, 1L, (Dimension *)0);
1035
ret = ((Array *)PushDataBlock(NewArray(&stringStruct, tmpDims)))->value.q;
1037
for (i=0 ; i<nitems ; ++i) {
1038
OpTable *sym_ops = globTab[i].ops;
1039
if (sym_ops == &dataBlockSym) {
1040
Operations *ops = globTab[i].value.db->ops;
1042
if ((unsigned int)type > T_OPAQUE || ! match[type]) {
1045
if (type == T_OPAQUE) {
1046
if (ops == &listOps) {
1050
} else if (ops == &auto_ops) {
1051
if (omit_autoload) {
1060
} else if (sym_ops == &longScalar ||
1061
sym_ops == &intScalar ||
1062
sym_ops == &doubleScalar) {
1068
*ret++ = p_strcpy(globalTable.names[i]);
1082
#undef GET_STRUCTDEF
925
1088
/*--------------------------------------------------------------------------*/