void Y_gy_setlocale(int argc) { if (argc > 2) y_error("gy_setlocale, [[CATEGORY, ], LOCALE]"); char * scat="LC_ALL"; char * sloc =NULL; int cat=0; if (argc == 2) scat = ygets_q(1); if (yarg_string(0)) sloc = ygets_q(0); if (!strcmp(scat, "LC_ALL")) cat = LC_ALL; else if (!strcmp(scat, "LC_COLLATE")) cat = LC_COLLATE; else if (!strcmp(scat, "LC_CTYPE")) cat = LC_CTYPE; else if (!strcmp(scat, "LC_MONETARY")) cat = LC_MONETARY; else if (!strcmp(scat, "LC_NUMERIC")) cat = LC_NUMERIC; else if (!strcmp(scat, "LC_TIME")) cat = LC_TIME; else y_error("unsupported locale category"); if (sloc && cat==LC_NUMERIC && strcmp(sloc, "C")) y_error("Yorick does not support LC_NUMERIC != \"C\""); *ypush_q(0) = p_strcpy(setlocale(cat, sloc)); setlocale(LC_NUMERIC, "C"); }
void Y_timestamp(int argc) { time_t n_time = time((void *)0); char *time = ctime(&n_time); long index = yget_ref(0); if (argc != 1) y_error("timestamp takes exactly one argument"); if (index >= 0) { ypush_long((long)n_time); yput_global(index, 0); } if (!yarg_subroutine()) { char **q = ypush_q(0); q[0] = p_strcpy(strtok(time, "\n")); } }
void gy_value_push(GValue * pval, GITypeInfo * info, gy_Object* o) { GITypeTag tag = g_type_info_get_tag(info); GY_DEBUG("Pushing %s from GValue\n", g_type_tag_to_string(tag)); switch (tag) { /* basic types */ case GI_TYPE_TAG_VOID:{ GITypeInfo * cellinfo = g_type_info_get_param_type(info, 0); if (cellinfo) { GITypeTag ctag = g_type_info_get_tag(cellinfo); GY_DEBUG("void contains %s\n", g_type_tag_to_string(ctag)); g_base_info_unref(cellinfo); } ypush_nil(); break;} case GI_TYPE_TAG_BOOLEAN: *ypush_c(NULL) = g_value_get_boolean(pval); break; case GI_TYPE_TAG_INT8: *ypush_gint8(NULL) = g_value_get_schar(pval); break; case GI_TYPE_TAG_UINT8: *ypush_guint8(NULL)= g_value_get_uchar(pval); break; case GI_TYPE_TAG_INT16: case GI_TYPE_TAG_INT32: *ypush_gint32(NULL) = g_value_get_int(pval); break; case GI_TYPE_TAG_UINT16: case GI_TYPE_TAG_UINT32: *ypush_guint32(NULL) = g_value_get_uint(pval); break; case GI_TYPE_TAG_INT64: ypush_long(g_value_get_int64(pval)); break; case GI_TYPE_TAG_UINT64: ypush_long(g_value_get_uint64(pval)); break; case GI_TYPE_TAG_FLOAT: *ypush_f(NULL)=g_value_get_float(pval); break; case GI_TYPE_TAG_DOUBLE: ypush_double(g_value_get_double(pval)); break; case GI_TYPE_TAG_GTYPE: ypush_long(g_value_get_gtype(pval)); break; case GI_TYPE_TAG_UTF8: case GI_TYPE_TAG_FILENAME: *ypush_q(NULL) = p_strcpy(g_value_get_string(pval)); break; /* array types */ case GI_TYPE_TAG_ARRAY: y_error("array"); break; /* interface types */ case GI_TYPE_TAG_INTERFACE: { GIBaseInfo * itrf = g_type_info_get_interface (info); switch(g_base_info_get_type (itrf)) { case GI_INFO_TYPE_ENUM: ypush_long(g_value_get_enum(pval)); g_base_info_unref(itrf); break; case GI_INFO_TYPE_OBJECT: { GObject * prop=g_value_get_object(pval); g_object_ref_sink(prop); if (!prop) { g_base_info_unref(itrf); y_error("get property failed"); } GY_DEBUG("pushing result... "); ypush_check(1); gy_Object * out = ypush_gy_Object(); out->info=itrf; out->object=prop; out->repo=o->repo; } break; default: g_base_info_unref(itrf); y_error ("fix me: only properties of type object supported yet"); } break; } default: y_error("Unimplemented"); } }
static void push_string(const char* str) { ypush_q(NULL)[0] = p_strcpy(str); }