Esempio n. 1
0
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;
}
Esempio n. 2
0
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;
}
Esempio n. 3
0
File: prompt.c Progetto: ris21/yoda
/* 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);
    }
}
Esempio n. 4
0
File: prompt.c Progetto: ris21/yoda
/* 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);
}
Esempio n. 5
0
/*
**	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);
}