-
Notifications
You must be signed in to change notification settings - Fork 1
/
3-ui_to_b.c
110 lines (105 loc) · 1.75 KB
/
3-ui_to_b.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
#include "main.h"
#include <stdio.h>
/**
* to_base_len - len of dec nums converted to base
* @n: num of which we want len
* @base: convert to base from DEC
*
* Return: len
*/
unsigned int to_base_len(unsigned int n, int base)
{
unsigned int i;
for (i = 0; n > 0; i++)
n = n / base;
return (i);
}
/**
* _cpy - copy n bytes from src to dest
* @dest: destination
* @src: source
* @n: num of bytes
*
* Return: ptr to char
*/
char *_cpy(char *dest, char *src, unsigned int n)
{
unsigned int i;
for (i = 0; i < n; i++)
dest[i] = src[i];
dest[i] = '\0';
return (dest);
}
/**
* reverse - reverse string
* @s: str to reverse
*
* Return: ptr to char
*/
char *reverse(char *s)
{
int i, j;
char hld;
char *dest;
for (i = 0; s[i] != '\0'; i++)
;
dest = malloc(sizeof(char) * i + 1);
if (dest == NULL)
return (NULL);
_cpy(dest, s, i);
for (j = 0; j < i; j++, i--)
{
hld = dest[i - 1];
dest[i - i] = dest[j];
dest[j] = hld;
}
return (dest);
}
/**
* _write_str - display sequence of chars
* @s: sequence to be displayed
*/
void _write_str(char *s)
{
int i;
for (i = 0; s[i] != '\0'; i++)
_write_ch(s[i]);
}
/**
* print_to_bin - convert to binary
* @list: list of args
*
* Return: len of num we are converting to bin
*/
int print_to_bin(va_list list)
{
unsigned int n;
int i, ln;
char *rev;
char *s;
n = va_arg(list, unsigned int);
if (n == 0)
return (_write_ch('0'));
if (n < 1)
return (-1);
ln = to_base_len(n, 2);
s = malloc(sizeof(char) * ln + 1);
if (s == NULL)
return (-1);
for (i = 0; n > 0; i++)
{
if (n % 2 == 0)
s[i] = '0';
else
s[i] = '1';
n /= 2;
}
s[i] = '\0';
rev = reverse(s);
if (rev == NULL)
return (-1);
_write_str(rev);
free(s);
free(rev);
return (ln);
}