Changes in / [7922158:d34575b]


Ignore:
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • libcfa/prelude/builtins.c

    r7922158 rd34575b  
    1010// Created On       : Fri Jul 21 16:21:03 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Thu Nov 21 16:31:39 2019
    13 // Update Count     : 101
     12// Last Modified On : Wed Jul  8 22:43:14 2020
     13// Update Count     : 105
    1414//
    1515
     
    9595static inline forall( dtype DT ) DT * intptr( uintptr_t addr ) { return (DT *)addr; }
    9696
     97// constructor for 128-bit numbers (all constants are unsigned as +/- are operators)
     98static inline void ?{}( unsigned int128 & this, unsigned long int h, unsigned long int l ) {
     99        this = (unsigned int128)h << 64 | (unsigned int128)l;
     100} // ?{}
     101
    97102// exponentiation operator implementation
    98103
  • libcfa/src/concurrency/kernel.cfa

    r7922158 rd34575b  
    1010// Created On       : Tue Jan 17 12:27:26 2017
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Tue May 26 22:05:19 2020
    13 // Update Count     : 59
     12// Last Modified On : Thu Jul  9 06:22:54 2020
     13// Update Count     : 66
    1414//
    1515
     
    148148//-----------------------------------------------------------------------------
    149149// Global state
    150 thread_local struct KernelThreadData kernelTLS __attribute__ ((tls_model ( "initial-exec" ))) = {
     150thread_local struct KernelThreadData kernelTLS __attribute__ ((tls_model ( "initial-exec" ))) @= {
    151151        NULL,                                                                                           // cannot use 0p
    152152        NULL,
    153153        NULL,
    154154        { 1, false, false },
    155         6u //this should be seeded better but due to a bug calling rdtsc doesn't work
    156155};
    157156
  • libcfa/src/iostream.cfa

    r7922158 rd34575b  
    1010// Created On       : Wed May 27 17:56:53 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Mon Jul  6 08:49:48 2020
    13 // Update Count     : 1064
     12// Last Modified On : Wed Jul  8 22:14:20 2020
     13// Update Count     : 1069
    1414//
    1515
     
    675675                f.val = val % power;
    676676                if ( cnt == 1 && f.flags.left ) { wd = f.wd; f.wd = maxdig; } // copy f.wd and reset for printing middle chunk
     677                // printf( "R val:%#lx(%lu) wd:%u pc:%u base:%c neg:%d pc:%d left:%d nobsdp:%d sign:%d pad0:%d\n",
     678                //              f.val, f.val, f.wd, f.pc, f.base, f.flags.neg, f.flags.pc, f.flags.left, f.flags.nobsdp, f.flags.sign, f.flags.pad0 );
    677679                (ostype &)(os | f);
    678680                if ( cnt == 1 ) {
     
    715717
    716718                if ( f.flags.neg ) f.val = -f.val;
     719                // printf( "L val:%#lx(%lu) wd:%u pc:%u base:%c neg:%d pc:%d left:%d nobsdp:%d sign:%d pad0:%d\n",
     720                //              f.val, f.val, f.wd, f.pc, f.base, f.flags.neg, f.flags.pc, f.flags.left, f.flags.nobsdp, f.flags.sign, f.flags.pad0 );
    717721                (ostype &)(os | f);
    718722
  • src/Parser/ExpressionNode.cc

    r7922158 rd34575b  
    1010// Created On       : Sat May 16 13:17:07 2015
    1111// Last Modified By : Peter A. Buhr
    12 // Last Modified On : Wed Dec 18 21:14:58 2019
    13 // Update Count     : 981
     12// Last Modified On : Sat Jul 11 16:44:49 2020
     13// Update Count     : 1034
    1414//
    1515
     
    8585        } // if
    8686        // remove "lL" for these cases because it may not imply long
    87         str.erase( posn );                                                                      // remove length
     87        str.erase( posn );                                                                      // remove length suffix and "uU"
    8888} // lnthSuffix
    8989
     
    108108} // valueToType
    109109
     110static void scanbin( string & str, unsigned long long int & v ) {
     111        v = 0;
     112        size_t last = str.length() - 1;                                         // last subscript of constant
     113        for ( unsigned int i = 2;; ) {                                          // ignore prefix
     114                if ( str[i] == '1' ) v |= 1;
     115                i += 1;
     116          if ( i == last - 1 || (str[i] != '0' && str[i] != '1') ) break;
     117                v <<= 1;
     118        } // for
     119} // scanbin
     120
    110121Expression * build_constantInteger( string & str ) {
    111122        static const BasicType::Kind kind[2][6] = {
    112123                // short (h) must be before char (hh) because shorter type has the longer suffix
    113                 { BasicType::ShortSignedInt, BasicType::SignedChar, BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt, BasicType::SignedInt128, },
    114                 { BasicType::ShortUnsignedInt, BasicType::UnsignedChar, BasicType::UnsignedInt, BasicType::LongUnsignedInt, BasicType::LongLongUnsignedInt, BasicType::UnsignedInt128, },
     124                { BasicType::ShortSignedInt, BasicType::SignedChar, BasicType::SignedInt, BasicType::LongSignedInt, BasicType::LongLongSignedInt, /* BasicType::SignedInt128 */ BasicType::LongLongSignedInt, },
     125                { BasicType::ShortUnsignedInt, BasicType::UnsignedChar, BasicType::UnsignedInt, BasicType::LongUnsignedInt, BasicType::LongLongUnsignedInt, /* BasicType::UnsignedInt128 */ BasicType::LongLongUnsignedInt, },
    115126        };
    116127
     
    120131        }; // lnthsInt
    121132
    122         unsigned long long int v;                                                       // converted integral value
    123         size_t last = str.length() - 1;                                         // last subscript of constant
    124         Expression * ret;
    125         //string fred( str );
     133        string str2( "0x0" );
     134        unsigned long long int v, v2 = 0;                                       // converted integral value
     135        Expression * ret, * ret2;
    126136
    127137        int type = -1;                                                                          // 0 => short, 1 => char, 2 => int, 3 => long int, 4 => long long int, 5 => int128
     
    139149        } // if
    140150
     151        string::size_type posn;
     152
     153        // 'u' can appear before or after length suffix
     154        if ( str.find_last_of( "uU" ) != string::npos ) Unsigned = true;
     155
     156        if ( isdigit( str[str.length() - 1] ) ) {                       // no suffix ?
     157                lnthSuffix( str, type, ltype );                                 // could have length suffix
     158                if ( type == 5 && Unsigned ) str.erase( str.length() - 1 ); // L128 and terminating "uU" ?
     159        } else {
     160                // At least one digit in integer constant, so safe to backup while looking for suffix.
     161
     162                posn = str.find_last_of( "pP" );                                // pointer value
     163                if ( posn != string::npos ) { ltype = 5; str.erase( posn, 1 ); goto FINI; }
     164
     165                posn = str.find_last_of( "zZ" );                                // size_t
     166                if ( posn != string::npos ) { Unsigned = true; type = 2; ltype = 4; str.erase( posn, 1 ); goto FINI; }
     167
     168                posn = str.rfind( "hh" );                                               // char
     169                if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; }
     170
     171                posn = str.rfind( "HH" );                                               // char
     172                if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; }
     173
     174                posn = str.find_last_of( "hH" );                                // short
     175                if ( posn != string::npos ) { type = 0; str.erase( posn, 1 ); goto FINI; }
     176
     177                posn = str.find_last_of( "nN" );                                // int (natural number)
     178                if ( posn != string::npos ) { type = 2; str.erase( posn, 1 ); goto FINI; }
     179
     180                if ( str.rfind( "ll" ) != string::npos || str.rfind( "LL" ) != string::npos ) { type = 4; goto FINI; }
     181
     182                lnthSuffix( str, type, ltype );                                 // must be after check for "ll"
     183          FINI: ;
     184        } // if
     185
    141186        // Cannot be just "0"/"1"; sscanf stops at the suffix, if any; value goes over the wall => always generate
    142 
     187       
    143188        if ( str[0] == '0' ) {                                                          // radix character ?
    144189                dec = false;
    145190                if ( checkX( str[1] ) ) {                                               // hex constant ?
    146                         sscanf( (char *)str.c_str(), "%llx", &v );
     191                        if ( type < 5 ) {                                                       // not L128 ?
     192                                sscanf( (char *)str.c_str(), "%llx", &v );
     193                        } else {                                                                        // hex int128 constant
     194                                unsigned int len = str.length();
     195                                if ( len > (2 + 16 + 16) ) SemanticError( yylloc, "128-bit hexadecimal constant to large " + str );
     196                          if ( len <= (2 + 16) ) goto FHEX1;            // hex digits < 2^64
     197                                str2 = "0x" + str.substr( len - 16 );
     198                                sscanf( (char *)str2.c_str(), "%llx", &v2 );
     199                                str = str.substr( 0, len - 16 );
     200                          FHEX1: ;
     201                                sscanf( (char *)str.c_str(), "%llx", &v );
     202                        } // if
    147203                        //printf( "%llx %llu\n", v, v );
    148204                } else if ( checkB( str[1] ) ) {                                // binary constant ?
    149                         v = 0;                                                                          // compute value
    150                         for ( unsigned int i = 2;; ) {                          // ignore prefix
    151                                 if ( str[i] == '1' ) v |= 1;
    152                                 i += 1;
    153                           if ( i == last - 1 || (str[i] != '0' && str[i] != '1') ) break;
    154                                 v <<= 1;
    155                         } // for
     205                        unsigned int len = str.length();
     206                        if ( type == 5 && len > 2 + 64 ) {
     207                                if ( len > 2 + 64 + 64 ) SemanticError( yylloc, "128-bit binary constant to large " + str );
     208                                str2 = "0b" + str.substr( len - 64 );
     209                                str = str.substr( 0, len - 64 );
     210                                scanbin( str2, v2 );
     211                        } // if
     212                        scanbin( str, v );
    156213                        //printf( "%#llx %llu\n", v, v );
    157214                } else {                                                                                // octal constant
    158                         sscanf( (char *)str.c_str(), "%llo", &v );
     215                        if ( type < 5 ) {                                                       // not L128 ?
     216                                sscanf( (char *)str.c_str(), "%llo", &v );
     217                        } else {                                                                        // octal int128 constant
     218                                unsigned int len = str.length();
     219                                char buf[32];
     220                                __int128 val = v;
     221                               
     222                                if ( len > 1 + 43 || (len == 1 + 43 && str[0] > '3') ) SemanticError( yylloc, "128-bit octal constant to large " + str );
     223                                if ( len <= 1 + 21 ) {                                  // value < 21 octal digitis
     224                                        sscanf( (char *)str.c_str(), "%llo", &v ); // leave value in octal
     225                                } else {
     226                                        sscanf( &str[len - 21], "%llo", &v );
     227                                        val = v;                                                        // store bits
     228                                        str[len - 21] ='\0';                            // shorten string
     229                                        sscanf( &str[len == 43 ? 1 : 0], "%llo", &v );
     230                                        val |= (__int128)v << 63;                       // store bits
     231                                        if ( len == 1 + 43 ) {                          // most significant 2 bits ?
     232                                                str[2] = '\0';                                  // shorten string
     233                                                sscanf( &str[1], "%llo", &v );  // process most significant 2 bits
     234                                                val |= (__int128)v << 126;              // store bits
     235                                        } // if
     236                                        v = val >> 64; v2 = (uint64_t)val;      // replace octal constant with 2 hex constants
     237                                        sprintf( buf, "%#llx", v2 );
     238                                        str2 = buf;
     239                                        sprintf( buf, "%#llx", v );
     240                                        str = buf;
     241                                } // if
     242                        } // if
    159243                        //printf( "%#llo %llu\n", v, v );
    160244                } // if
    161245        } else {                                                                                        // decimal constant ?
    162                 sscanf( (char *)str.c_str(), "%llu", &v );
     246                if ( type < 5 ) {                                                               // not L128 ?
     247                        sscanf( (char *)str.c_str(), "%llu", &v );
     248                } else {                                                                                // decimal int128 constant
     249                        #define P10_UINT64 10'000'000'000'000'000'000ULL // 19 zeroes
     250                        unsigned int len = str.length();
     251                        char buf[32];
     252                        __int128 val = v;
     253
     254                        if ( str.length() == 39 && str > (Unsigned ? "340282366920938463463374607431768211455" : "170141183460469231731687303715884105727") )
     255                                SemanticError( yylloc, "128-bit decimal constant to large " + str );
     256                        if ( len <= 19 ) {                                                      // value < 19 decimal digitis
     257                                sscanf( (char *)str.c_str(), "%llu", &v ); // leave value in decimal
     258                        } else {
     259                                sscanf( &str[len - 19], "%llu", &v );
     260                                val = v;                                                                // store bits
     261                                str[len - 19] ='\0';                                    // shorten string
     262                                sscanf( &str[len == 39 ? 1 : 0], "%llu", &v );
     263                                val += (__int128)v * (__int128)P10_UINT64; // store bits
     264                                if ( len == 39 ) {                                              // most significant 2 bits ?
     265                                        str[1] = '\0';                                          // shorten string
     266                                        sscanf( &str[0], "%llu", &v );          // process most significant 2 bits
     267                                        val += (__int128)v * (__int128)P10_UINT64 * (__int128)P10_UINT64; // store bits
     268                                } // if
     269                                v = val >> 64; v2 = (uint64_t)val;              // replace decimal constant with 2 hex constants
     270                                sprintf( buf, "%#llx", v2 );
     271                                str2 = buf;
     272                                sprintf( buf, "%#llx", v );
     273                                str = buf;
     274                        } // if
     275                } // if
    163276                //printf( "%llu\n", v );
    164277        } // if
    165278
    166         string::size_type posn;
    167 
    168         if ( isdigit( str[last] ) ) {                                           // no suffix ?
    169                 lnthSuffix( str, type, ltype );                                 // could have length suffix
    170                 if ( type == -1 ) {                                                             // no suffix
    171                         valueToType( v, dec, type, Unsigned );
    172                 } // if
    173         } else {
    174                 // At least one digit in integer constant, so safe to backup while looking for suffix.
    175 
    176                 posn = str.find_last_of( "pP" );
    177                 if ( posn != string::npos ) { valueToType( v, dec, type, Unsigned ); ltype = 5; str.erase( posn, 1 ); goto FINI; }
    178 
    179                 posn = str.find_last_of( "zZ" );
    180                 if ( posn != string::npos ) { Unsigned = true; type = 2; ltype = 4; str.erase( posn, 1 ); goto FINI; }
    181 
    182                 // 'u' can appear before or after length suffix
    183                 if ( str.find_last_of( "uU" ) != string::npos ) Unsigned = true;
    184 
    185                 posn = str.rfind( "hh" );
    186                 if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; }
    187 
    188                 posn = str.rfind( "HH" );
    189                 if ( posn != string::npos ) { type = 1; str.erase( posn, 2 ); goto FINI; }
    190 
    191                 posn = str.find_last_of( "hH" );
    192                 if ( posn != string::npos ) { type = 0; str.erase( posn, 1 ); goto FINI; }
    193 
    194                 posn = str.find_last_of( "nN" );
    195                 if ( posn != string::npos ) { type = 2; str.erase( posn, 1 ); goto FINI; }
    196 
    197                 if ( str.rfind( "ll" ) != string::npos || str.rfind( "LL" ) != string::npos ) { type = 4; goto FINI; }
    198 
    199                 lnthSuffix( str, type, ltype );                                 // must be after check for "ll"
    200                 if ( type == -1 ) {                                                             // only 'u' suffix ?
    201                         valueToType( v, dec, type, Unsigned );
    202                 } // if
    203           FINI: ;
    204         } // if
     279        if ( type == -1 ) {                                                                     // no suffix => determine type from value size
     280                valueToType( v, dec, type, Unsigned );
     281        } // if
     282        /* printf( "%s %llo %s %llo\n", str.c_str(), v, str2.c_str(), v2 ); */
    205283
    206284        //if ( !( 0 <= type && type <= 6 ) ) { printf( "%s %lu %d %s\n", fred.c_str(), fred.length(), type, str.c_str() ); }
     
    214292        } else if ( ltype != -1 ) {                                                     // explicit length ?
    215293                if ( ltype == 6 ) {                                                             // int128, (int128)constant
    216                         ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][type] ), false );
     294//                      ret = new CastExpr( ret, new BasicType( Type::Qualifiers(), kind[Unsigned][type] ), false );
     295                        ret2 = new ConstantExpr( Constant( new BasicType( noQualifiers, BasicType::LongLongSignedInt ), str2, v2 ) );
     296                        ret = build_compoundLiteral( DeclarationNode::newBasicType( DeclarationNode::Int128 )->addType( DeclarationNode::newSignedNess( DeclarationNode::Unsigned ) ),
     297                                                                                 new InitializerNode( (InitializerNode *)(new InitializerNode( new ExpressionNode( v2 == 0 ? ret2 : ret ) ))->set_last( new InitializerNode( new ExpressionNode( v2 == 0 ? ret : ret2 ) ) ), true ) );
    217298                } else {                                                                                // explicit length, (length_type)constant
    218299                        ret = new CastExpr( ret, new TypeInstType( Type::Qualifiers(), lnthsInt[Unsigned][ltype], false ), false );
  • tests/errors/.expect/completeType.txt

    r7922158 rd34575b  
    132132?=?: pointer to function
    133133        ... with parameters
    134           reference to instance of type _108_0_T (not function type)
    135           instance of type _108_0_T (not function type)
     134          reference to instance of type _109_0_T (not function type)
     135          instance of type _109_0_T (not function type)
    136136        ... returning
    137           _retval__operator_assign: instance of type _108_0_T (not function type)
     137          _retval__operator_assign: instance of type _109_0_T (not function type)
    138138          ... with attributes:
    139139            Attribute with name: unused
  • tests/manipulatorsOutput3.cfa

    r7922158 rd34575b  
    11#include <fstream.hfa>
     2
    23int main() {
    3     int128 x = 0xffff, y = 0x2;
    4     x <<= 64;
    5     x += 0xffff;
    6     y <<= 64;
    7     y += 0123;
    8     y |= 0x8000000000000000;
    9     x = -x;
    10     sout | x;
    11     sout | sign(x);
    12     x = -x;
    13     sout | sign(x);
    14     sout | nl;
     4        int128 x = 0xffff, y = 0x2;
     5        x <<= 64;
     6        x += 0xffff;
     7        y <<= 64;
     8        y += 0123;
     9        y |= 0x8000000000000000;
     10        x = -x;
     11        sout | x;
     12        sout | sign(x);
     13        x = -x;
     14        sout | sign(x);
     15        sout | nl;
    1516
    16     sout | bin(x);
    17     sout | upcase(bin(x));
    18     sout | nobase(bin(x));
    19     sout | wd( 95, upcase(bin(x)) );
    20     sout | wd( 95,90, upcase(bin(x)) );
    21     sout | wd( 25,30, upcase(hex(x)) );
    22     sout | nl;
     17        sout | bin(x);
     18        sout | upcase(bin(x));
     19        sout | nobase(bin(x));
     20        sout | wd( 95, upcase(bin(x)) );
     21        sout | wd( 95,90, upcase(bin(x)) );
     22        sout | wd( 25,30, upcase(hex(x)) );
     23        sout | nl;
    2324
    24     printf( "%#.10o\n", 0123 );
    25     sout | wd( 1,10, oct(0123) );
    26     sout | oct(x);
    27     sout | nobase(oct(x));
    28     sout | wd( 45, oct(0123) );
    29     sout | wd( 45,40, oct(0123) );
    30     sout | wd( 40,45, oct(0123) );
    31     sout | wd( 45, oct(x) );
    32     sout | wd( 45,40, oct(x) );
    33     sout | wd( 40,45, oct(x) );
     25        printf( "%#.10o\n", 0123 );
     26        sout | wd( 1,10, oct(0123) );
     27        sout | oct(x);
     28        sout | nobase(oct(x));
     29        sout | wd( 45, oct(0123) );
     30        sout | wd( 45,40, oct(0123) );
     31        sout | wd( 40,45, oct(0123) );
     32        sout | wd( 45, oct(x) );
     33        sout | wd( 45,40, oct(x) );
     34        sout | wd( 40,45, oct(x) );
    3435
    35     sout | left(wd( 45, oct(0123) )) | 'X';
    36     sout | left(wd( 45, oct(x) )) | 'X';
    37     sout | left(wd( 45, oct(y) )) | 'X';
    38     sout | left(wd( 45,40, oct(0123) )) | 'X';
    39     sout | left(wd( 45,40, oct(x) )) | 'X';
    40     sout | left(wd( 45,40, oct(y) )) | 'X';
    41     sout | left(wd( 40,45, oct(0123) )) | 'X';
    42     sout | left(wd( 40,45, oct(x) )) | 'X';
    43     sout | left(wd( 40,45, oct(y) )) | 'X';
    44     printf( "%#-1.10oX\n", 0123 );
    45     sout | left(wd( 1,10, oct(0123) )) | 'X';
    46     printf( "%#-40.10oX\n", 0123 );
    47     sout | left(wd( 40,10, oct(0123) )) | 'X';
    48     sout | left(wd( 40,10, oct(x) )) | 'X';
    49     sout | left(wd( 40,10, oct(y) )) | 'X';
    50     sout | left(wd( 10,40, oct(0123) )) | 'X';
    51     sout | left(wd( 10,40, oct(x) )) | 'X';
    52     sout | left(wd( 10,40, oct(y) )) | 'X';
     36        sout | left(wd( 45, oct(0123) )) | 'X';
     37        sout | left(wd( 45, oct(x) )) | 'X';
     38        sout | left(wd( 45, oct(y) )) | 'X';
     39        sout | left(wd( 45,40, oct(0123) )) | 'X';
     40        sout | left(wd( 45,40, oct(x) )) | 'X';
     41        sout | left(wd( 45,40, oct(y) )) | 'X';
     42        sout | left(wd( 40,45, oct(0123) )) | 'X';
     43        sout | left(wd( 40,45, oct(x) )) | 'X';
     44        sout | left(wd( 40,45, oct(y) )) | 'X';
     45        printf( "%#-1.10oX\n", 0123 );
     46        sout | left(wd( 1,10, oct(0123) )) | 'X';
     47        printf( "%#-40.10oX\n", 0123 );
     48        sout | left(wd( 40,10, oct(0123) )) | 'X';
     49        sout | left(wd( 40,10, oct(x) )) | 'X';
     50        sout | left(wd( 40,10, oct(y) )) | 'X';
     51        sout | left(wd( 10,40, oct(0123) )) | 'X';
     52        sout | left(wd( 10,40, oct(x) )) | 'X';
     53        sout | left(wd( 10,40, oct(y) )) | 'X';
    5354
    54     y = 01234567;
    55     sout | left(wd( 45, 49, oct(y) )) | 'X';
    56     y = -y;
    57     sout | wd(0, oct(y)) | 'Y';
    58     sout | left(wd(0, oct(y))) | 'Y';
    59     sout | nl;
     55        y = 01234567;
     56        sout | left(wd( 45, 49, oct(y) )) | 'X';
     57        y = -y;
     58        sout | wd(0, oct(y)) | 'Y';
     59        sout | left(wd(0, oct(y))) | 'Y';
     60        sout | nl;
    6061
    61     sout | hex(x);
    62     sout | upcase(hex(x));
    63     sout | nobase(hex(x));
    64     sout | wd( 45, upcase(hex(x)) );
    65     sout | wd( 45,40, upcase(hex(x)) );
    66     sout | wd( 45,49, upcase(hex(x)) );
    67     sout | left(wd( 45, upcase(hex(x)) )) | 'X';
    68     sout | left(wd( 45,40, upcase(hex(x)) )) | 'X';
    69     sout | left(wd( 45,49, upcase(hex(x)) )) | 'X';
     62        sout | hex(x);
     63        sout | upcase(hex(x));
     64        sout | nobase(hex(x));
     65        sout | wd( 45, upcase(hex(x)) );
     66        sout | wd( 45,40, upcase(hex(x)) );
     67        sout | wd( 45,49, upcase(hex(x)) );
     68        sout | left(wd( 45, upcase(hex(x)) )) | 'X';
     69        sout | left(wd( 45,40, upcase(hex(x)) )) | 'X';
     70        sout | left(wd( 45,49, upcase(hex(x)) )) | 'X';
    7071
    71     sout | nl;
     72        sout | nl;
    7273
    73     int128 divisor = 0x4b3b4ca85a86c47a;
    74     divisor <<= 16;
    75     divisor += 0x98a224000000000;
    76    
    77     // base 2
    78     sout | "base 2";
    79     sout | bin(divisor);
    80     sout | upcase(bin(divisor));
    81     sout | wd(38, upcase(bin(divisor)));
    82     sout | wd(40, upcase(bin(divisor)));
    83     sout | wd(40, 38, upcase(bin(divisor)));
    84     sout | wd(40, 30, upcase(bin(divisor)));
    85     sout | pad0(sign(wd(40, 38, upcase(bin(divisor)))));
    86     sout | nl;
    87    
    88     // oct
    89     sout | "base 8";
    90     sout | upcase(oct(divisor));
    91     sout | wd(38, upcase(oct(divisor)));
    92     sout | wd(40, upcase(oct(divisor)));
    93     sout | wd(40, 38, upcase(oct(divisor)));
    94     sout | wd(40, 30, upcase(oct(divisor)));
    95     sout | pad0(sign(wd(40, 38, upcase(oct(divisor)))));
    96     sout | nl;
     74        int128 divisor = 0x4b3b4ca85a86c47a;
     75        divisor <<= 16;
     76        divisor += 0x98a224000000000;
     77       
     78        // base 2
     79        sout | "base 2";
     80        sout | bin(divisor);
     81        sout | upcase(bin(divisor));
     82        sout | wd(38, upcase(bin(divisor)));
     83        sout | wd(40, upcase(bin(divisor)));
     84        sout | wd(40, 38, upcase(bin(divisor)));
     85        sout | wd(40, 30, upcase(bin(divisor)));
     86        sout | pad0(sign(wd(40, 38, upcase(bin(divisor)))));
     87        sout | nl;
     88       
     89        // oct
     90        sout | "base 8";
     91        sout | upcase(oct(divisor));
     92        sout | wd(38, upcase(oct(divisor)));
     93        sout | wd(40, upcase(oct(divisor)));
     94        sout | wd(40, 38, upcase(oct(divisor)));
     95        sout | wd(40, 30, upcase(oct(divisor)));
     96        sout | pad0(sign(wd(40, 38, upcase(oct(divisor)))));
     97        sout | nl;
    9798
    98     // decimal
    99     sout | "base 10";
    100     sout | divisor;
    101     sout | wd(2, divisor);
    102     sout | wd(3, divisor);
    103     sout | wd(10, divisor);
    104     sout | wd(24, divisor);
    105     sout | wd(38, divisor);
    106     sout | wd(39, divisor);
    107     sout | wd(40, divisor);
    108    
    109     sout | wd(40, 30, divisor);
    110     sout | wd(40, 38, divisor);
    111     sout | wd(40, 40, divisor);
    112     sout | pad0(wd(40, divisor));
    113     sout | pad0(sign(wd(40,divisor)));
    114     sout | nl;
    115    
    116     // hex
    117     sout | "base 16";
    118     sout | upcase(hex(divisor));
    119     sout | wd(38, upcase(hex(divisor)));
    120     sout | wd(40, upcase(hex(divisor)));
    121     sout | wd(40, 38, upcase(hex(divisor)));
    122     sout | wd(40, 30, upcase(hex(divisor)));
    123     sout | pad0(sign(wd(40, 38, upcase(hex(divisor)))));
    124     sout | nl;
     99        // decimal
     100        sout | "base 10";
     101        sout | divisor;
     102        sout | wd(2, divisor);
     103        sout | wd(3, divisor);
     104        sout | wd(10, divisor);
     105        sout | wd(24, divisor);
     106        sout | wd(38, divisor);
     107        sout | wd(39, divisor);
     108        sout | wd(40, divisor);
     109       
     110        sout | wd(40, 30, divisor);
     111        sout | wd(40, 38, divisor);
     112        sout | wd(40, 40, divisor);
     113        sout | pad0(wd(40, divisor));
     114        sout | pad0(sign(wd(40,divisor)));
     115        sout | nl;
     116       
     117        // hex
     118        sout | "base 16";
     119        sout | upcase(hex(divisor));
     120        sout | wd(38, upcase(hex(divisor)));
     121        sout | wd(40, upcase(hex(divisor)));
     122        sout | wd(40, 38, upcase(hex(divisor)));
     123        sout | wd(40, 30, upcase(hex(divisor)));
     124        sout | pad0(sign(wd(40, 38, upcase(hex(divisor)))));
     125        sout | nl;
    125126
    126127
    127     // extras
    128     sout | "extras";
    129     sout | bin(divisor);
    130     sout | upcase(bin(divisor));
    131     sout | oct(divisor);
    132     sout | hex(divisor);
    133     sout | upcase(hex(divisor));
    134     sout | nobase(bin(divisor)) | nobase(oct(divisor)) | nobase(hex(divisor));
    135     sout | sign(divisor);
    136     sout | -divisor;
    137     sout | sign(-divisor);
    138     sout | wd(2, divisor);
    139     sout | wd(3,10,divisor);
    140     sout | left(wd(40,divisor)) | 'X';
    141     sout | left(sign(wd(40, divisor))) | 'X';
    142     sout | left(sign(wd(0,40, divisor))) | 'X';
    143     printf( "%-+1.40dX\n", 123456789 );
     128        // extras
     129        sout | "extras";
     130        sout | bin(divisor);
     131        sout | upcase(bin(divisor));
     132        sout | oct(divisor);
     133        sout | hex(divisor);
     134        sout | upcase(hex(divisor));
     135        sout | nobase(bin(divisor)) | nobase(oct(divisor)) | nobase(hex(divisor));
     136        sout | sign(divisor);
     137        sout | -divisor;
     138        sout | sign(-divisor);
     139        sout | wd(2, divisor);
     140        sout | wd(3,10,divisor);
     141        sout | left(wd(40,divisor)) | 'X';
     142        sout | left(sign(wd(40, divisor))) | 'X';
     143        sout | left(sign(wd(0,40, divisor))) | 'X';
     144        printf( "%-+1.40dX\n", 123456789 );
    144145
    145     int128 i128;
    146     unsigned int128 ui128;
     146        int128 i128;
     147        unsigned int128 ui128;
    147148
    148     i128 = -10;
    149     for ( 25 ) {
     149        i128 = -10;
     150        for ( 25 ) {
    150151        sout | left( sign( wd( 20, i128 ) ) ) | left( wd( 20, hex( i128 ) ) ) | left( wd( 20, oct( i128 ) ) );
    151152        sout | left( wd( 20, bin( i128 ) ) );
    152153        i128 += 1;
    153     }
    154     sout | nl;
     154        }
     155        sout | nl;
     156        i128 = 0x7fffffffffffffff;
     157        i128 <<= 64;
     158        i128 += 0xfffffffffffffffa;
    155159
    156     i128 = 0x7fffffffffffffff;
    157     i128 <<= 64;
    158     i128 += 0xfffffffffffffffa;
    159 
    160     for ( 20 ) {
     160//    for ( 20 ) {
     161        volatile int stop = 20;
     162        for ( int i = 0; i < stop; i += 1 ) {
    161163        sout | i128;
    162164        sout | left( sign( wd( 45, i128 ) ) ) | left( wd( 45, hex( i128 ) ) ) | left( wd( 45, oct( i128 ) ) );
    163165        sout | left( wd( 45, bin( i128 ) ) );
    164166        i128 += 1;
    165     }
    166     sout | nl;
     167        }
     168        sout | nl;
    167169
    168     ui128 = 0x7fffffffffffffff;
    169     ui128 <<= 64;
    170     ui128 += 0xfffffffffffffffa;
    171    
    172     for ( 20 ) {
    173         sout | ui128;
    174         ui128 += 1;
    175     }
    176     sout | nl;
     170        ui128 = 0x7fffffffffffffff;
     171        ui128 <<= 64;
     172        ui128 += 0xfffffffffffffffa;
     173       
     174        for ( 20 ) {
     175                sout | ui128;
     176                ui128 += 1;
     177        }
     178        sout | nl;
    177179
    178     ui128 = 0xffffffffffffffff;
    179     ui128 <<= 64;
    180     ui128 += 0xfffffffffffffffa;
    181    
    182     for ( 20 ) {
    183         sout | ui128;
    184         ui128 += 1;
    185     }
     180        ui128 = 0xffffffffffffffff;
     181        ui128 <<= 64;
     182        ui128 += 0xfffffffffffffffa;
     183       
     184        for ( 20 ) {
     185                sout | ui128;
     186                ui128 += 1;
     187        }
    186188}
     189
     190// Local Variables: //
     191// tab-width: 4 //
     192// compile-command: "cfa -Wall -Wextra amanipulatorsOutput3.cfa" //
     193// End: //
Note: See TracChangeset for help on using the changeset viewer.