Esempio n. 1
0
*/	REBINT Emit_Integer(REBYTE *buf, REBI64 val)
/*
***********************************************************************/
{
	INT_TO_STR(val, buf);
	return LEN_BYTES(buf);
}
Esempio n. 2
0
*/	REBOOL Cloak(REBOOL decode, REBYTE *cp, REBCNT dlen, REBYTE *kp, REBCNT klen, REBFLG as_is)
/*
**		Simple data scrambler. Quality depends on the key length.
**		Result is made in place (data string).
**
**		The key (kp) is passed as a REBVAL or REBYTE (when klen is !0).
**
***********************************************************************/
{
	REBCNT i, n;
	REBYTE src[20];
	REBYTE dst[20];

	if (dlen == 0) return TRUE;

	// Decode KEY as VALUE field (binary, string, or integer)
	if (klen == 0) {
		REBVAL *val = (REBVAL*)kp;
		REBSER *ser;

		switch (VAL_TYPE(val)) {
		case REB_BINARY:
			kp = VAL_BIN_DATA(val);
			klen = VAL_LEN(val);
			break;
		case REB_STRING:
			ser = Temp_Bin_Str_Managed(val, &i, &klen);
			kp = BIN_SKIP(ser, i);
			break;
		case REB_INTEGER:
			INT_TO_STR(VAL_INT64(val), dst);
			klen = LEN_BYTES(dst);
			as_is = FALSE;
			break;
		}

		if (klen == 0) return FALSE;
	}

	if (!as_is) {
		for (i = 0; i < 20; i++) src[i] = kp[i % klen];
		SHA1(src, 20, dst);
		klen = 20;
		kp = dst;
	}

	if (decode)
		for (i = dlen-1; i > 0; i--) cp[i] ^= cp[i-1] ^ kp[i % klen];

	// Change starting byte based all other bytes.
	n = 0xa5;
	for (i = 1; i < dlen; i++) n += cp[i];
	cp[0] ^= (REBYTE)n;

	if (!decode)
		for (i = 1; i < dlen; i++) cp[i] ^= cp[i-1] ^ kp[i % klen];

	return TRUE;
}
Esempio n. 3
0
*/	REBYTE *Form_Integer(REBYTE *buf, REBI64 val)
/*
**		Form standard REBOL integer value (32 or 64).
**		Make sure you have room in your buffer before calling this!
**
***********************************************************************/
{
	INT_TO_STR(val, buf);
	return buf+LEN_BYTES(buf);
}
Esempio n. 4
0
//
//  Cloak: C
// 
// Simple data scrambler. Quality depends on the key length.
// Result is made in place (data string).
// 
// The key (kp) is passed as a REBVAL or REBYTE (when klen is !0).
//
REBOOL Cloak(REBOOL decode, REBYTE *cp, REBCNT dlen, REBYTE *kp, REBCNT klen, REBOOL as_is)
{
    REBCNT i, n;
    REBYTE src[20];
    REBYTE dst[20];

    if (dlen == 0) return TRUE;

    // Decode KEY as VALUE field (binary, string, or integer)
    if (klen == 0) {
        REBVAL *val = (REBVAL*)kp;
        REBSER *ser;

        switch (VAL_TYPE(val)) {
        case REB_BINARY:
            kp = VAL_BIN_AT(val);
            klen = VAL_LEN_AT(val);
            break;
        case REB_STRING:
            ser = Temp_Bin_Str_Managed(val, &i, &klen);
            kp = BIN_AT(ser, i);
            break;
        case REB_INTEGER:
            INT_TO_STR(VAL_INT64(val), dst);
            klen = LEN_BYTES(dst);
            as_is = FALSE;
            break;
        }

        if (klen == 0) return FALSE;
    }

    if (!as_is) {
        for (i = 0; i < 20; i++) src[i] = kp[i % klen];
        SHA1(src, 20, dst);
        klen = 20;
        kp = dst;
    }

    if (decode)
        for (i = dlen-1; i > 0; i--) cp[i] ^= cp[i-1] ^ kp[i % klen];

    // Change starting byte based all other bytes.
    n = 0xa5;
    for (i = 1; i < dlen; i++) n += cp[i];
    cp[0] ^= (REBYTE)n;

    if (!decode)
        for (i = 1; i < dlen; i++) cp[i] ^= cp[i-1] ^ kp[i % klen];

    return TRUE;
}
Esempio n. 5
0
STOID Mold_Logic(REB_MOLD *mold, REBVAL *value)
{
	REBYTE buf[20];
	Pre_Mold(value, mold);

	INT_TO_STR(VAL_LOGIC(value), buf);
	Append_Bytes(mold->series, buf);
	Append_Byte(mold->series, ' ');

	old_Block_Series(mold, BLK_HEAD(VAL_LOGIC_WORDS(value)), 0);

	End_Mold(mold);
}
Esempio n. 6
0
REBINT Emit_Decimal(REBYTE *cp, REBDEC d, REBFLG trim, REBYTE point, REBINT decimal_digits) {
	REBYTE *start = cp, *sig, *rve;
	REBINT e, sgn, digits_obtained;

	/* sanity checks */
	if (decimal_digits < MIN_DIGITS) decimal_digits = MIN_DIGITS;
	else if (decimal_digits > MAX_DIGITS) decimal_digits = MAX_DIGITS;

	sig = (REBYTE *) dtoa (d, 0, decimal_digits, &e, &sgn, (char **) &rve);

	digits_obtained = rve - sig;

	/* handle sign */
	if (sgn) *cp++ = '-';

	if (trim == DEC_MOLD_PERCENT) e += 2;

	if ((e > decimal_digits) || (e <= -6)) {
		/* e-format */
		*cp++ = *sig++;

		/* insert the radix point */
		*cp++ = point;

		/* insert the rest */
		memcpy(cp, sig, digits_obtained - 1);
		cp += digits_obtained - 1;
	} else if (e > 0) {
		if (e <= digits_obtained) {
			/* insert digits preceding point */
			memcpy (cp, sig, e);
			cp += e;
			sig += e;

			*cp++ = point;

			/* insert digits following point */
			memcpy(cp, sig, digits_obtained -  e);
			cp += digits_obtained - e;
		} else {
			/* insert all digits obtained */
			memcpy (cp, sig, digits_obtained);
			cp += digits_obtained;

			/* insert zeros preceding point */
			memset (cp, '0', e - digits_obtained);
			cp += e - digits_obtained;

			*cp++ = point;
		}
		e = 0;
	} else {
		*cp++ = '0';

		*cp++ = point;

		memset(cp, '0', -e);
		cp -= e;

		memcpy(cp, sig, digits_obtained);
		cp += digits_obtained;

		e = 0;
	}

	// Add at least one zero after point (unless percent or pair):
	if (*(cp - 1) == point) {if (trim) cp--; else *cp++ = '0';}

	// Add E part if needed:
	if (e) {
		*cp++ = 'e';
		INT_TO_STR(e - 1, cp);
		cp = strchr(cp, 0);
	}

 	if (trim == DEC_MOLD_PERCENT) *cp++ = '%';
	*cp = 0;
	return cp - start;
}
Esempio n. 7
0
//
//  Form_Integer: C
//
// Form standard REBOL integer value (32 or 64).
// Make sure you have room in your buffer before calling this!
//
REBYTE *Form_Integer(REBYTE *buf, REBI64 val)
{
    INT_TO_STR(val, buf);
    return buf+LEN_BYTES(buf);
}
Esempio n. 8
0
static int fill_iso8601_timestamp(int32_t timestamp, int32_t milli,
                                  char* buffer, int* length) {
  int16_t year;
  int8_t month, month_length;
  int32_t day;
  int8_t hour, minute, second;

  if (*length < SIZE_ISO_8601) {
    *length = SIZE_ISO_8601;
    return E_BUFFER_TOO_SMALL;
  }

  second = timestamp % 60;
  timestamp /= 60; // now it is minutes

  minute = timestamp % 60;
  timestamp /= 60; // now it is hours

  hour = timestamp % 24;
  timestamp /= 24; // now it is days

  year = 0;
  day = 0;
  while ((day += days_in_year(year)) <= timestamp) {
    year++;
  }
  day -= days_in_year(year);
  timestamp -= day; // now it is days in this year, starting at 0

  day = 0;
  month_length = 0;
  for (month = 0; month < 12; month++) {
    if (month == 1) {
      // February
      month_length = is_leap_year(year) ? 29 : 28;
    } else {
      month_length = MONTH_DAYS[month];
    }

    if (timestamp >= month_length) {
      timestamp -= month_length;
    } else {
      break;
    }
  }
  year = 1970 + year;
  month++; // offset by 1
  day = timestamp + 1;

  int i = 0, j = 0;

  // NOTE: It seems the snprintf implementation in Arduino has bugs,
  // we have to manually piece the string together here.
#define INT_TO_STR(v_, width_) \
  for (j = 0; j < (width_); j++) { \
    buffer[i + (width_) - 1 - j] = '0' + ((v_) % 10); \
    (v_) /= 10; \
  } \
  i += (width_)

  INT_TO_STR(year, 4);
  buffer[i++] = '-';
  INT_TO_STR(month, 2);
  buffer[i++] = '-';
  INT_TO_STR(day, 2);
  buffer[i++] = 'T';
  INT_TO_STR(hour, 2);
  buffer[i++] = ':';
  INT_TO_STR(minute, 2);
  buffer[i++] = ':';
  INT_TO_STR(second, 2);
  buffer[i++] = '.';
  INT_TO_STR(milli, 3);
  buffer[i++] = 'Z';
  buffer[i++] = '\0';

#undef INT_TO_STR

  *length = i;
  return E_OK;
}