Byte* FSIO::_write_alloc(int& size) { int count = _write_count(); // XXX deal with any outstanding writes if (err) return 0; ASSERT(writer.ptr <= writer.end); off_t off = write_offset(); Byte* b = writer.ptr; writer.ptr += size; if (writer.ptr > writer.creg->limit) { int bsize = roundup(size, bufsize); Byte* oldbuffer = 0; /* * If creg is in use, we must allocate a new region */ if (writer.creg->refcount != 0) { writer.creg->limit = b; writer.creg = new Region(writer.creg); writer.creg->set_buf(new unsigned char[bsize], bsize); } else if (bsize != bufsize) { oldbuffer = writer.creg->base; writer.creg->set_buf(new unsigned char[bsize], bsize); } /* else reuse existing buffer and region */ writer.creg->flush_off = writer.creg->off = off; if (count) memmove(writer.creg->base, b, count); if (oldbuffer) delete[] oldbuffer; b = writer.creg->base; writer.ptr = b + size; writer.end = b + count; } if (writer.ptr > writer.end) writer.end = writer.ptr; writer.creg->refcount++; return b; }
int main(int argc, char **argv) { char offset_file[MAX_FILE_NAME]; char *file_name, *prog; ino_t inode; off_t offset; prog = argv[0]; if (argc != 2) { fprintf(stderr, "no filename specified\n"); usage(prog); return 1; } file_name = argv[1]; if (strlen(OFFSET_EXT) + strlen(file_name) + 1 > MAX_FILE_NAME) { fprintf(stderr, "%s: filename too long (max is %ld)\n", prog, MAX_FILE_NAME - strlen(OFFSET_EXT) - 1); return 1; } strncat(offset_file, file_name, sizeof(offset_file) - strlen(offset_file) - 1); strncat(offset_file, OFFSET_EXT, sizeof(offset_file) - strlen(offset_file) - 1); if (read_offset(offset_file, &inode, &offset) != 0) { fprintf(stderr, "%s: can't open offset file: %s\n", prog, strerror(errno)); return 1; } if (print_logs(file_name, &inode, &offset) != 0) { fprintf(stderr, "%s: can't read '%s': %s\n", prog, file_name, strerror(errno)); return 1; } if (write_offset(offset_file, inode, offset) != 0) { fprintf(stderr, "%s: can't write offset file: %s\n", prog, strerror(errno)); return 1; } return 0; }
int FSIO::_write_free(Byte* buf) { Region** rp; Region* reg = writer.find(buf, rp); if (!reg || reg->refcount == 0) { err = EINVAL; return -1; } reg->refcount--; if (reg->refcount == 0) { if (reg == writer.creg) { off_t off = write_offset(); writer.creg->limit = writer.end; writer.creg = new Region(writer.creg); writer.creg->set_buf(new unsigned char[bufsize], bufsize, off); writer.ptr = writer.end = writer.creg->base; } if (_write_flush(reg) < 0) { if (err) return -1; return 0; } *rp = reg->next; delete[] reg->base; delete reg; } return 0; }
int main(void) { message_t message; uint8_t next_grid[32]; uint16_t interval = 150; uint8_t current_pattern = 0; initialise(); set_up_timers(); init_timers(); HTbrightness(1); goto init; while (1) { if (mq_get(&message)) { switch (msg_get_event(message)) { case M_TIMER: memset(next_grid, 0, 32); for (uint8_t x = 0; x < 32; x++) { for (uint8_t y = 0; y < 8; y++) { uint8_t c = count(x, y); if (c == 3) next_grid[x] |= 1 << y; else if (c == 4) next_grid[x] |= leds[x] & (1 << y); } } memcpy(leds, next_grid, 32); HTsendscreen(); break; case M_KEY_DOWN: case M_KEY_REPEAT: switch (msg_get_param(message)) { case KEY_LEFT: if (interval > MIN_INTERVAL) { interval -= INTERVAL_INCREMENT; set_timer(interval, 0, true); } break; case KEY_RIGHT: if (interval < MAX_INTERVAL) { interval += INTERVAL_INCREMENT; set_timer(interval, 0, true); } break; case KEY_MIDDLE: current_pattern = (current_pattern + 1) % (sizeof(patterns) / sizeof(character)); init: memset(leds, 0, 32); write_offset(patterns[current_pattern], 10, 2); HTsendscreen(); set_timer(interval, 0, true); break; } break; } } } }