-
Notifications
You must be signed in to change notification settings - Fork 0
/
convert_helpers.c
138 lines (119 loc) · 2.44 KB
/
convert_helpers.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
#include "holberton.h"
#define SET_UP do { \
if (n == 0) \
{ \
*ptr = '0'; \
ptr++; \
*ptr = '\0'; \
return (buf); \
} \
while (u_mask <= n >> shift) \
u_mask <<= shift; \
\
digit = n / u_mask; \
while (digit == 0) \
{ \
n %= u_mask; \
u_mask >>= shift; \
digit = n / u_mask; \
} \
} while (0)
/**
* hex_convert - converts a number to hexadecimal
* @n: number to be converted
* @let_case: indicates if lowercase or uppercase letters are to be used
*
* Return: a string containing the converted number
*/
char *hex_convert(unsigned int n, int let_case)
{
unsigned int u_mask = 1;
unsigned int digit;
int shift = 4;
char *buf;
char *ptr;
char *array;
char low_array[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'};
char cap_array[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F'};
if (let_case == LOW)
array = low_array;
else if (let_case == CAP)
array = cap_array;
else
return (NULL);
buf = malloc(sizeof(unsigned int) * 8 + 2);
ptr = buf;
SET_UP;
while (u_mask > 15)
{
digit = n / u_mask;
*ptr = array[digit];
ptr++;
n %= u_mask;
u_mask >>= shift;
}
*ptr = array[n];
ptr++;
*ptr = '\0';
return (buf);
}
/**
* oct_convert - converts a number to octal
* @n: number to be converted
*
* Return: a string containing the converted number
*/
char *oct_convert(unsigned int n)
{
unsigned int u_mask = 1;
unsigned int digit;
int shift = 3;
char *buf = malloc(sizeof(unsigned int) * 16 + 2);
char *ptr = buf;
SET_UP;
while (u_mask > 7)
{
digit = n / u_mask;
*ptr = digit + '0';
ptr++;
n %= u_mask;
u_mask >>= shift;
}
*ptr = n + '0';
ptr++;
*ptr = '\0';
return (buf);
}
/**
* pointer_convert - converts an unsigned long long (address of pointer) to hex
* @n: number to be converted
*
* Return: a string containing the converted number
*/
char *pointer_convert(unsigned long long int n)
{
unsigned long long int u_mask = 1;
unsigned long long int digit;
int shift = 4;
char *buf;
char *ptr;
char array[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f'};
buf = malloc(sizeof(unsigned long long int) * 8 + 2);
ptr = buf;
SET_UP;
while (u_mask > 15)
{
digit = n / u_mask;
*ptr = array[digit];
ptr++;
n %= u_mask;
u_mask >>= shift;
}
*ptr = array[n];
ptr++;
*ptr = '\0';
return (buf);
}