Canola
0.8.D001
|
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 long long 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 :