Canola  0.8.D001
lib/number/z/constructor2.cc
Go to the documentation of this file.
00001 //
00002 // canola - canon canola 1614p emulator
00003 // Copyright (C) 2012 Peter Miller
00004 //
00005 // This program is free software; you can redistribute it and/or modify
00006 // it under the terms of the GNU General Public License, version 3, as
00007 // published by the Free Software Foundation.
00008 //
00009 // This program is distributed in the hope that it will be useful,
00010 // but WITHOUT ANY WARRANTY; without even the implied warranty of
00011 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012 // General Public License for more details.
00013 //
00014 // You should have received a copy of the GNU General Public License along
00015 // with this program. If not, see <http://www.gnu.org/licenses/>.
00016 //
00017 
00018 #include <lib/ac/assert.h>
00019 #include <lib/ac/string.h>
00020 
00021 #include <lib/number/z.h>
00022 
00023 
00024 number_z::number_z(unsigned rhs) :
00025     digits_used(0),
00026     digits_allocated(0),
00027     digits(0)
00028 {
00029     if (rhs)
00030     {
00031         typeof(rhs) n = rhs;
00032         for (;;)
00033         {
00034             ++digits_allocated;
00035             n /= 10;
00036             if (!n)
00037                 break;
00038         }
00039         for (;;)
00040         {
00041             size_t lsb = (digits_allocated & -digits_allocated);
00042             if (lsb == digits_allocated)
00043                 break;
00044             digits_allocated += lsb;
00045         }
00046 
00047         digits = new digit_t [digits_allocated];
00048         for (;;)
00049         {
00050             digits[digits_used] = rhs % 10;
00051             ++digits_used;
00052             rhs /= 10;
00053             if (!rhs)
00054                 break;
00055         }
00056         memset(digits + digits_used, 0, digits_allocated - digits_used);
00057     }
00058     assert(is_valid());
00059 }
00060 
00061 
00062 // vim: set ts=8 sw=4 et :