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")); } }
static void do_transfer(int argc, int (*transfer)(struct libusb_device_handle* handle, unsigned char endpoint, unsigned char* data, int length, int* transferred, unsigned int timeout)) { ydev_instance_t* obj; int ret, iarg; int endpoint, length, transferred, offset; long size; unsigned char* data; unsigned int timeout; long transferred_index; /* Get arguments. */ if (argc != 6 && argc != 7) { y_error("expecting 6 or 7 arguments"); } iarg = argc; obj = get_device(--iarg); endpoint = ygets_i(--iarg) & 0xff; /* uint8_t */ data = (unsigned char*)get_data(--iarg, &size); length = ygets_i(--iarg); if (length < 0) { y_error("invalid length"); } if (length > size) { y_error("length must be at most the size of the data"); } transferred_index = yget_ref(--iarg); if (transferred_index < 0L) { y_error("expecting a simple variable reference"); } timeout = (unsigned int)(ygets_l(--iarg) & 0xffffffffL); if (iarg > 0) { offset = ygets_i(--iarg); if (offset < 0 || offset > length) { y_error("invalid offset"); } } else { offset = 0; } /* Apply operation. */ if (length > offset) { ret = transfer(obj->handle, endpoint, data + offset, length - offset, &transferred, timeout); if (!(ret == 0 || (ret == LIBUSB_ERROR_TIMEOUT && transferred > 0))) { /* No data has been transferred. */ transferred = 0; if (yarg_subroutine()) { /* Some error has occured. */ failure(NULL, ret); } } } else { /* Nothing to do. */ transferred = 0; ret = 0; } if (transferred_index >= 0L) { /* Store total number of transferred bytes so far. */ ypush_int(offset + transferred); yput_global(transferred_index, 0); } ypush_int(ret); }