コード例 #1
0
ファイル: float.c プロジェクト: kwatch/rubinius
/* This functions is only used when unmarshalling. 
 * The assumptions made here are therefore safe.
 * String#to_f uses string_to_double
 */
OBJECT float_from_string(STATE, char *str) {
  char *endp;
  double d;  
  d = strtod(str, &endp);
  if (str != endp && *endp == '\0') {
    return float_new(state, d);
  }
  /* When we get here, we might have a system that doesn't conform to
     C99 (OpenBSD is at least one) that can't handle Infinity / NaN.
     We test the strings here manually and fix it if needed. */
  
  int sign = 0;
	
  if (*str == '-') {
    sign = 1;
    str++;
  } else if (*str == '+') {
    str++;
  }
  
  if (*str == 'I' || *str == 'i') {
    return float_new(state, sign ? -HUGE_VAL : HUGE_VAL);
  } 
  if (*str == 'N' || *str == 'n') {
    word0(d) = 0x7ff80000;
    word1(d) = 0;
    return float_new(state, d);
  }
  
  return Qnil;
}
コード例 #2
0
void reduce_do(char* buf, const size_t total, const std::string &out_folder){
	yucha::tool::recursive_mkdir(out_folder.c_str());

	size_t prev = 0;
	size_t split = 0;
	std::pair<size_t , size_t> p;
	MyHash h(buf);
	MyHashEq e(buf);
	MYMAP uni(3 , h , e);


	{
		size_t spaces[3];

		for(size_t i = 0 ; i < total; ++i){
			prev = i;
			unsigned short int count = 0;
			bool error = false;
			for(; buf[i] != '\n'; ++i){ //get freq
				if(buf[i] == '\t'){
					if (count==2){
						error = true;
					}
					else{
						spaces[count] = i;
						++count;
					};
				};
			};
			if (count!=2 or error)
				continue;

			buf[spaces[0]] = ' ';

			const size_t end_1 = spaces[0];
			const size_t end_2 = spaces[1];
			const size_t tail = i;

			std::pair<size_t , size_t> word1(prev, end_1);

			std::pair<size_t , size_t> word2(end_1+1 , end_2);

			buf[tail] = '\0';
			const unsigned long freq = atoi(&buf[end_2]);

			add(uni, word1, freq);
			add(uni, word2, freq);
		};
	}

	printout(1, uni, out_folder, buf, 0);

};
コード例 #3
0
ファイル: example4.c プロジェクト: flaviommedeiros/cprojects
#if defined(IEEE_Arith) + defined(VAX)
if ((word0 (d) & Exp_mask) == Exp_mask)
#else
  if (word0 (d) == 0x8000)
#endif
    {
      /* Infinity or NaN */
      *decpt = 9999;
      s =
#ifdef IEEE_Arith
	!word1 (d) && !(word0 (d) & 0xfffff) ? "Infinity" :
#endif
	"NaN";
      if (rve)
	*rve =
#ifdef IEEE_Arith
	  s[3] ? s + 8 :
#endif
	  s + 3;


      return s;
    }
コード例 #4
0
ファイル: load_tfm.cpp プロジェクト: Easycker/itexmacs
void
tex_font_metric_rep::execute (int* s, int n, int* buf, int* ker, int& m) {
  STACK_NEW_ARRAY (stack, int, m);
  int bp, sp=0, i;

  for (i=0; i<n; i++) stack[sp++]= s[n-1-i];
  sp--; bp= 0;

  while (sp>=0) {
    int cur_char= stack [sp]& 255;
    // cout << "Processing " << (char) cur_char << "\n";

    /***************** the ligature-kerning program ******************/
    if ((cur_char<bc) || (cur_char>ec)) sp--;
    else if ((tag (cur_char)==1) && (sp>0)) {
      register int next_char= stack [sp-1]& 255;
      register int pc= rem (cur_char);
      if (byte0 (lig_kern [pc]) > 128) pc= word1 (lig_kern [pc]);

      while (true) {
	register int instr= lig_kern [pc];

	//if (byte0 (instr) >= 128) { // halt
	//  // cout << "  Halt\n";
	//  ker [bp]  = 0;
	//  buf [bp++]= stack[sp--];
	//  break;
	//}

	if (byte1 (instr) != next_char) { // continue
	  // cout << "  " << (char) byte1 (instr) << " != " << (char) next_char
	  //      << " => pc := pc + " << (byte0 (instr)+1) << "\n";
	  int skip_byte = byte0(instr);
  	  if (skip_byte >= 128) { // current instruction is the final instruction
	    // cout << "  Halt\n";
	    ker [bp]  = 0;
	    buf [bp++]= stack[sp--];
	    break;
	  }
	  else {
	    pc += skip_byte+1;
	    continue;
	  }
	}

	// cout << "  " << (char) byte1 (instr) << " == "
	//      << (char) next_char << " => ";

	if (byte2 (instr) < 128) { // ligature
	  // cout << "Ligature ";
	  int code= byte2 (instr);
	  int a   = code>>2;
	  int b   = (code>>1)&1;
	  int c   = code&1;
	  // cout << "(" << a << "," << b << "," << c << ")\n";
	  if (b==0) sp--;
	  stack [sp++]= byte3 (instr);
	  if (c!=0) stack[sp++]= cur_char;
	  sp--;
	  while (a>0) {
	    ker [bp]  = 0;
	    buf [bp++]= stack [sp--];
	    a--;
	  }
	  break;
	}

	else { // kerning
	  // cout << "Kerning (" << kern  [word1x (instr)] << ")\n";
	  ker [bp]  = kern  [word1x (instr)];
	  buf [bp++]= stack [sp--];
	  break;
	}
      }
    }
コード例 #5
0
void reduce_do(char* buf, const size_t total, const std::string &out_folder){
	yucha::tool::recursive_mkdir(out_folder.c_str());

	size_t prev = 0;
	size_t split = 0;
	std::pair<size_t , size_t> p;
	MyHash h(buf);
	MyHashEq e(buf);
	MYMAP uni(3 , h , e);
	MYMAP bi(3 , h , e);
	MYMAP tri(3 , h , e);


	{
		size_t spaces[3];

		for(size_t i = 0 ; i < total; ++i){
			prev = i;
			unsigned short int count = 0;
			unsigned short int tab_count = 0;
			bool error = false;
			for(; buf[i] != '\n'; ++i){ //get freq
                if (buf[i] == '\t'){
                    if (tab_count < 2){
                        buf[i] = '=';
                    }
                    else{
						spaces[count] = i;
						++count;
                    };
                    ++tab_count;
                }
				else if(buf[i] == ' '){ //you can't use space
                   buf[i] = '_';
                }
				else if(buf[i] == ':'){ //SPLITTER is ':'
					if (count==3){
						error = true;
					}
					else{
						spaces[count] = i;
						++count;
					};
				};
			};
			if (count!=3 or error)
				continue;

			buf[spaces[0]] = ' ';
			buf[spaces[1]] = ' ';

			const size_t end_1 = spaces[0];
			const size_t end_2 = spaces[1];
			const size_t end_3 = spaces[2];
			const size_t tail = i;

			std::pair<size_t , size_t> word1(prev, end_1);

			std::pair<size_t , size_t> word2(end_1+1 , end_2);
			std::pair<size_t , size_t> bi1(prev, end_2);

			std::pair<size_t , size_t> word3(end_2+1 , end_3);
			std::pair<size_t , size_t> bi2(end_1+1, end_3);
			std::pair<size_t , size_t> tri1(prev, end_3);

			buf[tail] = '\0';
			const unsigned long freq = atoi(&buf[end_3]);

			add(uni, word1, freq);
			add(uni, word2, freq);
			add(uni, word3, freq);

			add(bi, bi1, freq);
			add(bi, bi2, freq);

			add(tri, tri1, freq);
		};
	}

	printout(1, uni, out_folder, buf, 0);
	printout(2, bi, out_folder, buf, 10000000);
	printout(3, tri, out_folder, buf, 10000000);


};
コード例 #6
0
ファイル: strtodI.c プロジェクト: 0mp/freebsd
strtodI(CONST char *s, char **sp, double *dd)
#endif
{
	static FPI fpi = { 53, 1-1023-53+1, 2046-1023-53+1, 1, SI };
	ULong bits[2], sign;
	Long exp;
	int j, k;
	U *u;

	k = strtodg(s, sp, &fpi, &exp, bits);
	u = (U*)dd;
	sign = k & STRTOG_Neg ? 0x80000000L : 0;
	switch(k & STRTOG_Retmask) {
	  case STRTOG_NoNumber:
		dval(&u[0]) = dval(&u[1]) = 0.;
		break;

	  case STRTOG_Zero:
		dval(&u[0]) = dval(&u[1]) = 0.;
#ifdef Sudden_Underflow
		if (k & STRTOG_Inexact) {
			if (sign)
				word0(&u[0]) = 0x80100000L;
			else
				word0(&u[1]) = 0x100000L;
			}
		break;
#else
		goto contain;
#endif

	  case STRTOG_Denormal:
		word1(&u[0]) = bits[0];
		word0(&u[0]) = bits[1];
		goto contain;

	  case STRTOG_Normal:
		word1(&u[0]) = bits[0];
		word0(&u[0]) = (bits[1] & ~0x100000) | ((exp + 0x3ff + 52) << 20);
	  contain:
		j = k & STRTOG_Inexact;
		if (sign) {
			word0(&u[0]) |= sign;
			j = STRTOG_Inexact - j;
			}
		switch(j) {
		  case STRTOG_Inexlo:
#ifdef Sudden_Underflow
			if ((u->L[_0] & 0x7ff00000) < 0x3500000) {
				word0(&u[1]) = word0(&u[0]) + 0x3500000;
				word1(&u[1]) = word1(&u[0]);
				dval(&u[1]) += ulp(&u[1]);
				word0(&u[1]) -= 0x3500000;
				if (!(word0(&u[1]) & 0x7ff00000)) {
					word0(&u[1]) = sign;
					word1(&u[1]) = 0;
					}
				}
			else
#endif
			dval(&u[1]) = dval(&u[0]) + ulp(&u[0]);
			break;
		  case STRTOG_Inexhi:
			dval(&u[1]) = dval(&u[0]);
#ifdef Sudden_Underflow
			if ((word0(&u[0]) & 0x7ff00000) < 0x3500000) {
				word0(&u[0]) += 0x3500000;
				dval(&u[0]) -= ulpdown(u);
				word0(&u[0]) -= 0x3500000;
				if (!(word0(&u[0]) & 0x7ff00000)) {
					word0(&u[0]) = sign;
					word1(&u[0]) = 0;
					}
				}
			else
#endif
			dval(&u[0]) -= ulpdown(u);
			break;
		  default:
			dval(&u[1]) = dval(&u[0]);
		  }
		break;

	  case STRTOG_Infinite:
		word0(&u[0]) = word0(&u[1]) = sign | 0x7ff00000;
		word1(&u[0]) = word1(&u[1]) = 0;
		if (k & STRTOG_Inexact) {
			if (sign) {
				word0(&u[1]) = 0xffefffffL;
				word1(&u[1]) = 0xffffffffL;
				}
			else {
				word0(&u[0]) = 0x7fefffffL;
				word1(&u[0]) = 0xffffffffL;
				}
			}
		break;

	  case STRTOG_NaN:
		u->L[0] = (u+1)->L[0] = d_QNAN0;
		u->L[1] = (u+1)->L[1] = d_QNAN1;
		break;

	  case STRTOG_NaNbits:
		word0(&u[0]) = word0(&u[1]) = 0x7ff00000 | sign | bits[1];
		word1(&u[0]) = word1(&u[1]) = bits[0];
	  }
	return k;
	}