int ring_read(ringBuffer_t *ring, char *buffer, int size) { // データ取得 int now_size = ring_size(ring); int pop_size = (size > now_size) ? now_size : size; if (ring->first <= ring->last) { charmove(buffer, &ring->buffer[ring->first], pop_size); ring->first += pop_size; } else { // first から buffer_size 終端までを配置 int left_size = 0; int to_end = ring->buffer_size - ring->first; int move_size = (to_end > pop_size) ? pop_size : to_end; charmove(buffer, &ring->buffer[ring->first], move_size); ring->first += move_size; ring->first &= (ring->buffer_size -1); left_size = pop_size - move_size; if (left_size > 0) { // 0 から last の前までを配置 charmove(&buffer[move_size], ring->buffer, left_size); ring->first = left_size; } } return pop_size; }
int ring_write(ringBuffer_t *ring, const char *data, int size) { int free_size = ring_capacity(ring) - ring_size(ring); int push_size = (size > free_size) ? free_size : size; // データ配置 if (ring->first <= ring->last) { // last から buffer_size 終端までに配置 int left_size = 0; int to_end = ring->buffer_size - ring->last; int move_size = (to_end > push_size) ? push_size : to_end; charmove(&ring->buffer[ring->last], data, move_size); ring->last += move_size; ring->last &= (ring->buffer_size -1); left_size = push_size - move_size; if (left_size > 0) { // 0 から first の前までを配置 charmove(ring->buffer, &data[move_size], left_size); ring->last = left_size; } } else { // last から first の前まで配置 charmove(&ring->buffer[ring->last], data, size); ring->last += push_size; } return push_size; }
/* Delete one character. */ void do_statusbar_delete(void) { statusbar_pww = statusbar_xplustabs(); if (answer[statusbar_x] != '\0') { int char_buf_len = parse_mbchar(answer + statusbar_x, NULL, NULL); size_t line_len = strlen(answer + statusbar_x); assert(statusbar_x < strlen(answer)); charmove(answer + statusbar_x, answer + statusbar_x + char_buf_len, strlen(answer) - statusbar_x - char_buf_len + 1); null_at(&answer, statusbar_x + line_len - char_buf_len); update_statusbar_line(answer, statusbar_x); } }
/* The user typed output_len multibyte characters. Add them to the * statusbar prompt, setting got_enter to TRUE if we get a newline, and * filtering out all ASCII control characters if allow_cntrls is * TRUE. */ void do_statusbar_output(char *output, size_t output_len, bool *got_enter, bool allow_cntrls) { size_t answer_len, i = 0; char *char_buf = charalloc(mb_cur_max()); int char_buf_len; assert(answer != NULL); answer_len = strlen(answer); *got_enter = FALSE; while (i < output_len) { /* If allow_cntrls is TRUE, convert nulls and newlines * properly. */ if (allow_cntrls) { /* Null to newline, if needed. */ if (output[i] == '\0') output[i] = '\n'; /* Newline to Enter, if needed. */ else if (output[i] == '\n') { /* Set got_enter to TRUE to indicate that we got the * Enter key, put back the rest of the characters in * output so that they can be parsed and output again, * and get out. */ *got_enter = TRUE; unparse_kbinput(output + i, output_len - i); return; } } /* Interpret the next multibyte character. */ char_buf_len = parse_mbchar(output + i, char_buf, NULL); i += char_buf_len; /* If allow_cntrls is FALSE, filter out an ASCII control * character. */ if (!allow_cntrls && is_ascii_cntrl_char(*(output + i - char_buf_len))) continue; /* More dangerousness fun. =) */ answer = charealloc(answer, answer_len + (char_buf_len * 2)); assert(statusbar_x <= answer_len); charmove(answer + statusbar_x + char_buf_len, answer + statusbar_x, answer_len - statusbar_x + char_buf_len); strncpy(answer + statusbar_x, char_buf, char_buf_len); answer_len += char_buf_len; statusbar_x += char_buf_len; } free(char_buf); statusbar_pww = statusbar_xplustabs(); update_statusbar_line(answer, statusbar_x); }
/* ** transfer copies data from "*in" to ** Outbuf doing conversions whenever ** necessary */ int transfer(ANYTYPE *in, char sf, int sl, char df, int dl, int doff) /* in - pointer to input chars */ /* sf - source format */ /* sl - source length */ /* df - destination format */ /* dl - destination length */ /* doff - destination offset */ { register char *outp; register ANYTYPE *inp; register int i; int j; short smalli; char temp[MAX_FIELD_SIZE]; /* holds char during conversions to ascii */ float f; double d; long l; outp = &Outbuf[doff]; inp = in; if (sf == DUMMY) /* if source format is a dummy fields then nothing else need be done */ return (0); if (df == DUMMY) { /* fill field with dummy domain character */ i = dl; /* i equals the number of chars */ while (i--) *outp++ = sf; /* sf holds dummy char */ return (0); } if (sf != CHAR_CONST) { if (df == CHAR_CONST) { /* numeric to char conversion */ switch (sl) { /* int of size 1 or 2 */ case 1: itoa(inp->i1type, temp); break; case 2: itoa(inp->i2type, temp); /* convert to ascii */ break; /* int or float of size 4 */ case 4: if (sf == INT_CONST) { smove(locv(inp->i4type), temp); /* convert and copy */ } else { ftoa(inp->f4type, temp, dl, Out_arg.f4prec, Out_arg.f4style); } break; /* float of size 8 */ case 8: ftoa(inp->f8type, temp, dl, Out_arg.f8prec, Out_arg.f8style); break; /* there is no possible default */ default: syserr("bad domain length %d",sl); } j = strlen(temp); if ((i = dl - j) < 0) return (5808); /* field won't fit */ /* blank pad from left. Number will be right justified */ while (i--) *outp++ = ' '; bmove(temp, outp, j); return (0); } if (convert(inp, outp, sf, sl, df, dl)) /* numeric to numeric transfer */ return (DOMTOOSMALL); /* numeric truncation error */ return (0); } /* character to numeric conversion */ /* and character to character conversion */ switch (df) { case CHAR_CONST: i = sl; if (!i) { i = strlen(inp->c0type); } if (i > dl) i = dl; if (charmove(inp->c0type, outp, i)) Baddoms++; for (outp += i; i<dl; i++) *outp++ = ' '; return (0); case FLOAT_CONST: if (ingres_atof(inp->c0type, &d)) return (BADINPUT); /* bad conversion to numeric */ if (dl == 8) { bmove(&d, outp, dl); } else { f = d; /* f8 to f4 conversion */ bmove(&f, outp, dl); } return (0); case INT_CONST: if (dl == 4) { if (ingres_atol(inp->c0type, &l)) return (5809); bmove(&l, outp, sizeof(l)); return (0); } smalli = atoi(inp->c0type); if (dl == 1) { if ((smalli < -128) || (smalli > 127)) return (5809); df = smalli; bmove(&df, outp, dl); } else bmove(&smalli, outp, dl); return (0); } return(0); }