Changeset 738


Ignore:
Timestamp:
May 21, 2003, 12:39:37 PM (18 years ago)
Author:
luba
Message:
  • expressions consisting of words are processed by the function
Location:
to-imperative/trunk/library/Convert
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • to-imperative/trunk/library/Convert/to_int.cc

    r730 r738  
    3838      flag = 1;
    3939    else
     40    if(((Word*)t)->is_number() == 2)
     41      flag = 0;
     42    else
    4043    retfail;
    4144
    42 
    43   if (t->get_type() == type_short_int)
     45  if (t->get_type() == type_short_int ||t->get_type() == type_word ) {
    4446    t++;
     47  }
    4548
    4649  for (; t < e_Exp.get_last(); t++) {
     
    6467    else
    6568      if (t->get_type() == type_word){
     69        // retfail, if '-' or '+' is the 1st symbol in the 2nd, 3rd,... word
     70        //   
     71        if (((Word*)t)->is_number() == 1 ||((Word*)t)->is_number() == -1 )
     72          retfail;
     73
    6674        size_t word_len = ((Word*)t)->get_len();
     75
    6776        if (len > UINTPTR_MAX - word_len)
    6877          RF_LIB_ERROR("Argument too large for conversion");
     
    7382      retfail;
    7483  };
    75 
    7684  if (len >= ShortInt::max_len)
    7785    RF_LIB_ERROR("Argument too large for conversion");
    78 
     86 
    7987  s_Int = ShortInt::create_expr(e_Exp, flag);
    8088 
  • to-imperative/trunk/library/Convert/to_word.cc

    r437 r738  
    1919
    2020  uintptr_t len = 0;
     21
    2122  Term* t = e_Exp.get_first();
    2223 
    2324  for (; t < e_Exp.get_last(); t++) {
    24     if (len > UINTPTR_MAX - t->get_char_len())
    25       RF_LIB_ERROR("Argument too large for conversion");
     25    if (t->get_type() == type_char)
     26      if (len > UINTPTR_MAX - 1)
     27        RF_LIB_ERROR("Argument too large for conversion");
     28      else
     29        len += 1;
    2630    else
    27       len += t->get_char_len();
     31      if (t->get_type() == type_short_int){
     32        size_t num_len = ShortInt::get_char_len(((ShortInt*)t)->to_int());
     33        if (len > UINTPTR_MAX - num_len)
     34          RF_LIB_ERROR("Argument too large for conversion");
     35      }
     36      else
     37        if (t->get_type() == type_word){
     38          size_t word_len = Word::get_char_len(((Word*)t)->to_wchar_t());
     39          //здесь - достать поле length из Word. вместп to_wchar_t()
     40          if (len > UINTPTR_MAX - word_len)
     41            RF_LIB_ERROR("Argument too large for conversion");
     42        }
     43        else
     44          retfail;
    2845  };
     46  //содержимое каждого терма записывать в какую-то строку, указатель на кот.
     47  //потом и передавать в create_expr(есть такой метод в классе Word...)
     48  //будет ли в входном e_Exp рефальская строка (ссылка на строку),
     49  //надо ли ее как отдельный тип рассматривать
     50  t = e_Exp.get_first();
     51  wchar_t* str;
     52  for (int i = 0 ; t < e_Exp.get_last(); t++, i++) {
     53    if (t->get_type() == type_char)
     54      str[i] = ((Char*)t)->to_wchar_t();
     55    if (t->get_type() == type_short_int)
     56      str[i] = ((ShortInt*)t)->to_int();
     57    if (t->get_type() == type_word)
     58      str[i] = ((Word*)t)->//взять содержимое - поле content и записывать его, изменяя i
     59        //прямо в этом цикле (сколько символов в самом слове, на столько и
     60        //i продвинуть
     61  };
     62  s_Word = Word::create_expr(str); 
    2963
     64#if 0
    3065  e_t_exp = Expr(len, 0);
    3166  Term* p = e_t_exp.get_first();
     
    3570  };
    3671  s_Word = Word(e_t_exp).to_symbol();
     72#endif
    3773
    3874RF_END
Note: See TracChangeset for help on using the changeset viewer.