112027Sjungma@eit.uni-kl.de/*****************************************************************************
212027Sjungma@eit.uni-kl.de
312027Sjungma@eit.uni-kl.de  Licensed to Accellera Systems Initiative Inc. (Accellera) under one or
412027Sjungma@eit.uni-kl.de  more contributor license agreements.  See the NOTICE file distributed
512027Sjungma@eit.uni-kl.de  with this work for additional information regarding copyright ownership.
612027Sjungma@eit.uni-kl.de  Accellera licenses this file to you under the Apache License, Version 2.0
712027Sjungma@eit.uni-kl.de  (the "License"); you may not use this file except in compliance with the
812027Sjungma@eit.uni-kl.de  License.  You may obtain a copy of the License at
912027Sjungma@eit.uni-kl.de
1012027Sjungma@eit.uni-kl.de    http://www.apache.org/licenses/LICENSE-2.0
1112027Sjungma@eit.uni-kl.de
1212027Sjungma@eit.uni-kl.de  Unless required by applicable law or agreed to in writing, software
1312027Sjungma@eit.uni-kl.de  distributed under the License is distributed on an "AS IS" BASIS,
1412027Sjungma@eit.uni-kl.de  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
1512027Sjungma@eit.uni-kl.de  implied.  See the License for the specific language governing
1612027Sjungma@eit.uni-kl.de  permissions and limitations under the License.
1712027Sjungma@eit.uni-kl.de
1812027Sjungma@eit.uni-kl.de *****************************************************************************/
1912027Sjungma@eit.uni-kl.de
2012027Sjungma@eit.uni-kl.de/*****************************************************************************
2112027Sjungma@eit.uni-kl.de
2212027Sjungma@eit.uni-kl.de  sc_int64_io.cpp --
2312027Sjungma@eit.uni-kl.de
2412027Sjungma@eit.uni-kl.de  Original Author: Amit Rao, Synopsys, Inc.
2512027Sjungma@eit.uni-kl.de
2612027Sjungma@eit.uni-kl.de *****************************************************************************/
2712027Sjungma@eit.uni-kl.de
2812027Sjungma@eit.uni-kl.de/*****************************************************************************
2912027Sjungma@eit.uni-kl.de
3012027Sjungma@eit.uni-kl.de  MODIFICATION LOG - modifiers, enter your name, affiliation, date and
3112027Sjungma@eit.uni-kl.de  changes you are making here.
3212027Sjungma@eit.uni-kl.de
3312027Sjungma@eit.uni-kl.de      Name, Affiliation, Date:
3412027Sjungma@eit.uni-kl.de  Description of Modification:
3512027Sjungma@eit.uni-kl.de
3612027Sjungma@eit.uni-kl.de *****************************************************************************/
3712027Sjungma@eit.uni-kl.de
3812027Sjungma@eit.uni-kl.de
3912027Sjungma@eit.uni-kl.de// $Log: sc_int64_io.cpp,v $
4012027Sjungma@eit.uni-kl.de// Revision 1.2  2011/02/18 20:19:14  acg
4112027Sjungma@eit.uni-kl.de//  Andy Goodrich: updating Copyright notice.
4212027Sjungma@eit.uni-kl.de//
4312027Sjungma@eit.uni-kl.de// Revision 1.1.1.1  2006/12/15 20:20:05  acg
4412027Sjungma@eit.uni-kl.de// SystemC 2.3
4512027Sjungma@eit.uni-kl.de//
4612027Sjungma@eit.uni-kl.de// Revision 1.3  2006/01/13 18:49:31  acg
4712027Sjungma@eit.uni-kl.de// Added $Log command so that CVS check in comments are reproduced in the
4812027Sjungma@eit.uni-kl.de// source.
4912027Sjungma@eit.uni-kl.de//
5012027Sjungma@eit.uni-kl.de
5112027Sjungma@eit.uni-kl.de#include "sysc/utils/sc_iostream.h"
5212027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_unsigned.h"
5312027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_signed.h"
5412027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_int_base.h"
5512027Sjungma@eit.uni-kl.de#include "sysc/datatypes/int/sc_uint_base.h"
5612027Sjungma@eit.uni-kl.de
5712027Sjungma@eit.uni-kl.de
5812027Sjungma@eit.uni-kl.de#if defined( _MSC_VER )
5912027Sjungma@eit.uni-kl.de
6012027Sjungma@eit.uni-kl.denamespace sc_dt
6112027Sjungma@eit.uni-kl.de{
6212027Sjungma@eit.uni-kl.de
6312027Sjungma@eit.uni-kl.destatic void
6412027Sjungma@eit.uni-kl.dewrite_uint64(::std::ostream& os, uint64 val, int sign)
6512027Sjungma@eit.uni-kl.de{
6612027Sjungma@eit.uni-kl.de    const int WRITE_BUF_SIZE = 10 + sizeof(uint64)*3;
6712027Sjungma@eit.uni-kl.de    char buf[WRITE_BUF_SIZE];
6812027Sjungma@eit.uni-kl.de    char* buf_ptr = buf + WRITE_BUF_SIZE;
6912027Sjungma@eit.uni-kl.de    const char* show_base = "";
7012027Sjungma@eit.uni-kl.de    int show_base_len = 0;
7112027Sjungma@eit.uni-kl.de    int show_pos = 0;
7212027Sjungma@eit.uni-kl.de    fmtflags flags = os.flags();
7312027Sjungma@eit.uni-kl.de
7412027Sjungma@eit.uni-kl.de    if ((flags & ::std::ios::basefield) == ::std::ios::oct) {
7512027Sjungma@eit.uni-kl.de        do {
7612027Sjungma@eit.uni-kl.de            *--buf_ptr = (char)((val & 7) + '0');
7712027Sjungma@eit.uni-kl.de            val = val >> 3;
7812027Sjungma@eit.uni-kl.de        } while (val != 0);
7912027Sjungma@eit.uni-kl.de        if ((flags & ::std::ios::showbase) && (*buf_ptr != '0'))
8012027Sjungma@eit.uni-kl.de            *--buf_ptr = '0';
8112027Sjungma@eit.uni-kl.de    } else if ((flags & ::std::ios::basefield) == ::std::ios::hex) {
8212027Sjungma@eit.uni-kl.de        const char* xdigs = (flags & ::std::ios::uppercase) ?
8312027Sjungma@eit.uni-kl.de            "0123456789ABCDEF0X" :
8412027Sjungma@eit.uni-kl.de            "0123456789abcdef0x";
8512027Sjungma@eit.uni-kl.de        do {
8612027Sjungma@eit.uni-kl.de            *--buf_ptr = xdigs[val & 15];
8712027Sjungma@eit.uni-kl.de            val = val >> 4;
8812027Sjungma@eit.uni-kl.de        } while (val != 0);
8912027Sjungma@eit.uni-kl.de        if ((flags & ::std::ios::showbase)) {
9012027Sjungma@eit.uni-kl.de            show_base = xdigs + 16;
9112027Sjungma@eit.uni-kl.de            show_base_len = 2;
9212027Sjungma@eit.uni-kl.de        }
9312027Sjungma@eit.uni-kl.de    } else {
9412027Sjungma@eit.uni-kl.de        while (val > UINT_MAX) {
9512027Sjungma@eit.uni-kl.de            *--buf_ptr = (char)((val % 10) + '0');
9612027Sjungma@eit.uni-kl.de            val /= 10;
9712027Sjungma@eit.uni-kl.de        }
9812027Sjungma@eit.uni-kl.de        unsigned ival = (unsigned) val;
9912027Sjungma@eit.uni-kl.de        do {
10012027Sjungma@eit.uni-kl.de            *--buf_ptr = (ival % 10) + '0';
10112027Sjungma@eit.uni-kl.de            ival /= 10;
10212027Sjungma@eit.uni-kl.de        } while (ival != 0);
10312027Sjungma@eit.uni-kl.de        if (sign > 0 && (flags & ::std::ios::showpos))
10412027Sjungma@eit.uni-kl.de            show_pos = 1;
10512027Sjungma@eit.uni-kl.de    }
10612027Sjungma@eit.uni-kl.de
10712027Sjungma@eit.uni-kl.de    int buf_len = buf + WRITE_BUF_SIZE - buf_ptr;
10812027Sjungma@eit.uni-kl.de    int w = os.width(0);
10912027Sjungma@eit.uni-kl.de
11012027Sjungma@eit.uni-kl.de    int len = buf_len + show_pos;
11112027Sjungma@eit.uni-kl.de    if (sign < 0) len++;
11212027Sjungma@eit.uni-kl.de    len += show_base_len;
11312027Sjungma@eit.uni-kl.de
11412027Sjungma@eit.uni-kl.de    int padding = len > w ? 0 : w - len;
11512027Sjungma@eit.uni-kl.de    fmtflags pad_kind = flags & ::std::ios::adjustfield;
11612027Sjungma@eit.uni-kl.de    char fill_char = os.fill();
11712027Sjungma@eit.uni-kl.de
11812027Sjungma@eit.uni-kl.de    if (padding > 0 &&
11912027Sjungma@eit.uni-kl.de        ::std::ios::left != pad_kind &&
12012027Sjungma@eit.uni-kl.de        ::std::ios::internal != pad_kind) {
12112027Sjungma@eit.uni-kl.de        for (int i = padding - 1; i >= 0; --i) {
12212027Sjungma@eit.uni-kl.de            if (! os.put(fill_char))
12312027Sjungma@eit.uni-kl.de                goto fail;
12412027Sjungma@eit.uni-kl.de        }
12512027Sjungma@eit.uni-kl.de    }
12612027Sjungma@eit.uni-kl.de    if (sign < 0 || show_pos) {
12712027Sjungma@eit.uni-kl.de        if (! os.put(sign < 0 ? '-' : '+'))
12812027Sjungma@eit.uni-kl.de            goto fail;
12912027Sjungma@eit.uni-kl.de    }
13012027Sjungma@eit.uni-kl.de    if (show_base_len) {
13112027Sjungma@eit.uni-kl.de        if (! os.write(show_base, show_base_len))
13212027Sjungma@eit.uni-kl.de            goto fail;
13312027Sjungma@eit.uni-kl.de    }
13412027Sjungma@eit.uni-kl.de    if ((fmtflags)::std::ios::internal == pad_kind && padding > 0) {
13512027Sjungma@eit.uni-kl.de        for (int i = padding - 1; i >= 0; --i) {
13612027Sjungma@eit.uni-kl.de            if (! os.put(fill_char))
13712027Sjungma@eit.uni-kl.de                goto fail;
13812027Sjungma@eit.uni-kl.de        }
13912027Sjungma@eit.uni-kl.de    }
14012027Sjungma@eit.uni-kl.de    if (! os.write(buf_ptr, buf_len))
14112027Sjungma@eit.uni-kl.de        goto fail;
14212027Sjungma@eit.uni-kl.de    if ((fmtflags)::std::ios::left == pad_kind && padding > 0) {
14312027Sjungma@eit.uni-kl.de        for (int i = padding - 1; i >= 0; --i) {
14412027Sjungma@eit.uni-kl.de            if (! os.put(fill_char))
14512027Sjungma@eit.uni-kl.de                goto fail;
14612027Sjungma@eit.uni-kl.de        }
14712027Sjungma@eit.uni-kl.de    }
14812027Sjungma@eit.uni-kl.de    os.osfx();
14912027Sjungma@eit.uni-kl.de    return;
15012027Sjungma@eit.uni-kl.defail:
15112027Sjungma@eit.uni-kl.de    //os.set(::std::ios::badbit);
15212027Sjungma@eit.uni-kl.de    os.osfx();
15312027Sjungma@eit.uni-kl.de}
15412027Sjungma@eit.uni-kl.de
15512027Sjungma@eit.uni-kl.de::std::ostream&
15612027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream& os, int64 n )
15712027Sjungma@eit.uni-kl.de{
15812027Sjungma@eit.uni-kl.de    if (os.opfx()) {
15912027Sjungma@eit.uni-kl.de        int sign = 1;
16012027Sjungma@eit.uni-kl.de        uint64 abs_n = (uint64) n;
16112027Sjungma@eit.uni-kl.de        if (n < 0 && (os.flags() & (::std::ios::oct|::std::ios::hex)) == 0) {
16212027Sjungma@eit.uni-kl.de            abs_n = -1*((uint64) n);
16312027Sjungma@eit.uni-kl.de            sign = -1;
16412027Sjungma@eit.uni-kl.de        }
16512027Sjungma@eit.uni-kl.de        sc_dt::write_uint64(os, abs_n, sign);
16612027Sjungma@eit.uni-kl.de    }
16712027Sjungma@eit.uni-kl.de    return os;
16812027Sjungma@eit.uni-kl.de}
16912027Sjungma@eit.uni-kl.de
17012027Sjungma@eit.uni-kl.de::std::ostream&
17112027Sjungma@eit.uni-kl.deoperator << ( ::std::ostream& os, uint64 n )
17212027Sjungma@eit.uni-kl.de{
17312027Sjungma@eit.uni-kl.de    if (os.opfx()) {
17412027Sjungma@eit.uni-kl.de        sc_dt::write_uint64(os, n, 0);
17512027Sjungma@eit.uni-kl.de    }
17612027Sjungma@eit.uni-kl.de    return os;
17712027Sjungma@eit.uni-kl.de}
17812027Sjungma@eit.uni-kl.de
17912027Sjungma@eit.uni-kl.de} // namespace sc_dt
18012027Sjungma@eit.uni-kl.de
18112027Sjungma@eit.uni-kl.de
18212027Sjungma@eit.uni-kl.de#endif
183