00001 #include <unistd.h>
00002
00003 #include "BUILD/bitc-runtime.h"
00004
00010
00011
00012 bitc_int32_t
00013 bitc_stdlib_atoi(bitc_string_t *str)
00014 {
00015 bitc_int32_t sign = 1;
00016 bitc_int32_t val = 0;
00017 bitc_int32_t base = 10;
00018 size_t i = 0;
00019
00020 if(str->s[i] == '-') {
00021 i++;
00022 sign = -1;
00023 }
00024
00025
00026 if (str->s[i] == 0) {
00027 i++;
00028
00029 switch (str->s[i]) {
00030 case 'x':
00031 case 'X':
00032 {
00033 base = 16;
00034 i++;
00035 break;
00036 }
00037 case 'b':
00038 case 'B':
00039 {
00040
00041 base = 2;
00042 i++;
00043 break;
00044 }
00045 default:
00046
00047 base = 8;
00048 break;
00049 }
00050 }
00051
00052 for ( ; i < str->length; i++) {
00053
00054
00055
00056
00057
00058
00059
00060
00061 unsigned char c = str->s[i];
00062 bitc_int32_t digit = (c - '0');
00063
00064 if (c < '0')
00065 break;
00066
00067 if ('0' <= c && c <= '9') {
00068 digit = (c - '0');
00069 if (digit >= base)
00070 break;
00071 }
00072 else if (base == 16) {
00073 if ('a' <= c && c <= 'f')
00074 digit = (c - 'a' + 10);
00075 else if ('A' <= c && c <= 'F')
00076 digit = (c - 'A' + 10);
00077 else
00078 break;
00079 }
00080 else
00081 break;
00082
00083 val = val * base + digit;
00084 }
00085
00086 return (val * sign);
00087 }
00088
00089 #if defined(__i386__)
00094
00095
00096 bitc_uns64_t
00097 bitc_stdlib_getTimeStamp()
00098 {
00099 unsigned long temp1=0;
00100 unsigned long temp2=0;
00101 unsigned long long ts=0;
00102 __asm__ volatile("rdtsc\t\n"
00103 "movl %%eax, %0\t\n"
00104 "movl %%edx, %1\t\n"
00105 : "=m" (temp1), "=m" (temp2)
00106 :
00107 : "%eax", "%edx");
00108
00109 ts = (((unsigned long long)temp2) << 32) + temp1;
00110 return ts;
00111 }
00112 #else
00113 bitc_uns64_t
00114 bitc_stdlib_getTimeStamp()
00115 {
00116 return 0;
00117 }
00118 #endif