value type_num(value f) { if (f->N == 0) { num_free(get_num(f)); return 0; } return type_void(f); }
int main(int argc, char **argv) { int i; struct num *num; for (i = 1; i < argc; i++) { num = xcalc(argv[i]); if (num) printf("%s <- %s\n", num_string(num), argv[i]); else printf("ERR!\n"); num_free(num); } return 0; }
/** Ported more or less directly from SanOS. */ int Virtio::Queue::enqueue(gsl::span<Token> buffers){ debug ("Enqueuing %i tokens \n", buffers.size()); uint16_t last = _free_head; uint16_t first = _free_head; // Place each buffer in a token for( auto buf : buffers ) { debug (" buf @ %p \n", buffers.data()); // Set read / write flags _queue.desc[_free_head].flags = buf.direction() ? VIRTQ_DESC_F_NEXT : VIRTQ_DESC_F_NEXT | VIRTQ_DESC_F_WRITE; // Assign raw buffer _queue.desc[_free_head].addr = (uint64_t) buf.data(); _queue.desc[_free_head].len = buf.size(); last = _free_head; _free_head = _queue.desc[_free_head].next; } _desc_in_flight += buffers.size(); Ensures(_desc_in_flight <= size()); // No continue on last buffer _queue.desc[last].flags &= ~VIRTQ_DESC_F_NEXT; // Place the head of this current chain in the avail ring uint16_t avail_index = (_queue.avail->idx + _num_added) % _size; // we added a token _num_added++; _queue.avail->ring[avail_index] = first; debug("<Q %i> avail_index: %i size: %i, _free_head %i \n", _pci_index, avail_index, size(), _free_head ); debug ("Free tokens: %i \n", num_free()); return buffers.size(); }