File conf.mk changed (mode: 100644) (index bd3e578..48e53b2) |
... |
... |
ifdef DEBUG |
22 |
22 |
CFLAGS+= -DDEBUG |
CFLAGS+= -DDEBUG |
23 |
23 |
endif |
endif |
24 |
24 |
|
|
|
25 |
|
#******************************************************************************* |
25 |
26 |
#customized your module list (scsi_wait is dealed with) |
#customized your module list (scsi_wait is dealed with) |
26 |
27 |
MODULES?=firmware_class ext4 ahci sd_mod sg |
MODULES?=firmware_class ext4 ahci sd_mod sg |
27 |
28 |
SCSI_WAIT?=1 |
SCSI_WAIT?=1 |
|
29 |
|
|
|
30 |
|
#milliseconds to wait for more uevents |
|
31 |
|
UEVENTS_TIMEOUT=1 |
|
32 |
|
|
|
33 |
|
#configure the root device |
|
34 |
|
ROOT=\"sdb3\" |
|
35 |
|
ROOT_FS=\"ext4\" |
|
36 |
|
ROOT_OPTIONS=\"discard\" |
|
37 |
|
ROOT_INIT=\"/sbin/init\" |
|
38 |
|
#******************************************************************************* |
|
39 |
|
|
28 |
40 |
ifdef SCSI_WAIT |
ifdef SCSI_WAIT |
29 |
41 |
MODULES+= scsi_wait_scan |
MODULES+= scsi_wait_scan |
30 |
42 |
CFLAGS+= -DSCSI_WAIT_SCAN |
CFLAGS+= -DSCSI_WAIT_SCAN |
31 |
43 |
endif |
endif |
|
44 |
|
|
|
45 |
|
CFLAGS+= -DROOT=$(ROOT) -DROOT_FS=$(ROOT_FS) -DROOT_OPTIONS=$(ROOT_OPTIONS) |
|
46 |
|
CFLAGS+= -DUEVENTS_TIMEOUT=$(UEVENTS_TIMEOUT) -DROOT_INIT=$(ROOT_INIT) |
File init.c changed (mode: 100644) (index 9650bdb..5a1f1d1) |
... |
... |
static void sigs_setup(void) |
42 |
42 |
OUTC("done\n"); |
OUTC("done\n"); |
43 |
43 |
} |
} |
44 |
44 |
|
|
|
45 |
|
static void newroot_mount(void) |
|
46 |
|
{ |
|
47 |
|
|
|
48 |
|
OUTC(PRE "mounting root device /dev/" ROOT " on /newroot...\n"); |
|
49 |
|
k_l r=sysc(mount,5,"/dev/" ROOT,"/newroot", |
|
50 |
|
ROOT_FS,K_MS_NOATIME|K_MS_NODIRATIME,ROOT_OPTIONS); |
|
51 |
|
if(K_ISERR(r)){ |
|
52 |
|
OUT("ERROR(%ld):unable to mount root\n",r); |
|
53 |
|
sysc(exit_group,1,-1); |
|
54 |
|
} |
|
55 |
|
|
|
56 |
|
} |
|
57 |
|
|
|
58 |
|
static void ramfs_cleanup(void) |
|
59 |
|
{ |
|
60 |
|
//TODO:eraze everything except /newroot |
|
61 |
|
} |
|
62 |
|
|
|
63 |
|
static void newroot_chdir() |
|
64 |
|
{ |
|
65 |
|
OUTC(PRE "chdir to /newroot..."); |
|
66 |
|
k_l r=sysc(chdir,1,"/newroot"); |
|
67 |
|
if(K_ISERR(r)){ |
|
68 |
|
OUT("ERROR(%ld):unable to chdir to /newroot\n",r); |
|
69 |
|
sysc(exit_group,1,-1); |
|
70 |
|
} |
|
71 |
|
OUTC("done\n"); |
|
72 |
|
} |
|
73 |
|
|
|
74 |
|
static void newroot_move(void) |
|
75 |
|
{ |
|
76 |
|
OUTC(PRE "mount moving . (/newroot) to / ..."); |
|
77 |
|
k_l r=sysc(mount,5,".","/",0,K_MS_MOVE,0); |
|
78 |
|
if(K_ISERR(r)){ |
|
79 |
|
OUT("ERROR(%ld):unable to mount move . (/newroot) to /\n",r); |
|
80 |
|
sysc(exit_group,1,-1); |
|
81 |
|
} |
|
82 |
|
OUTC("done\n"); |
|
83 |
|
} |
|
84 |
|
|
|
85 |
|
static void newroot_chroot(void) |
|
86 |
|
{ |
|
87 |
|
OUTC(PRE "chroot to . (/newroot)..."); |
|
88 |
|
k_l r=sysc(chroot,1,"."); |
|
89 |
|
if(K_ISERR(r)){ |
|
90 |
|
OUT("ERROR(%ld):unable to chroot to . (/newroot)\n",r); |
|
91 |
|
sysc(exit_group,1,-1); |
|
92 |
|
} |
|
93 |
|
OUTC("done\n"); |
|
94 |
|
} |
|
95 |
|
|
|
96 |
|
static void init_execve(void) |
|
97 |
|
{ |
|
98 |
|
k_l r=sysc(execve,4,ROOT_INIT,0,0,0); |
|
99 |
|
if(K_ISERR(r)){ |
|
100 |
|
OUT("ERROR(%ld):unable to run /sbin/init\n",r); |
|
101 |
|
sysc(exit_group,1,-1); |
|
102 |
|
} |
|
103 |
|
} |
|
104 |
|
|
45 |
105 |
void _start(void) |
void _start(void) |
46 |
106 |
{ |
{ |
47 |
107 |
# ifdef DEBUG |
# ifdef DEBUG |
|
108 |
|
//k_l r=sysc(open,3,"/dev/console",K_O_WRONLY|K_O_CLOEXEC,0); |
48 |
109 |
k_l r=sysc(open,3,"/dev/console",K_O_WRONLY,0); |
k_l r=sysc(open,3,"/dev/console",K_O_WRONLY,0); |
49 |
110 |
if(K_ISERR(r)) sysc(exit_group,1,-1); |
if(K_ISERR(r)) sysc(exit_group,1,-1); |
50 |
111 |
g_console=(k_i)r; |
g_console=(k_i)r; |
|
... |
... |
void _start(void) |
56 |
117 |
uevents_setup(); |
uevents_setup(); |
57 |
118 |
modules_load(); |
modules_load(); |
58 |
119 |
uevents_process(); |
uevents_process(); |
59 |
|
sysc(exit_group,1,0); |
|
|
120 |
|
newroot_mount(); |
|
121 |
|
ramfs_cleanup(); |
|
122 |
|
newroot_chdir(); |
|
123 |
|
newroot_move(); |
|
124 |
|
newroot_chroot(); |
|
125 |
|
init_execve(); |
60 |
126 |
} |
} |
File makefile changed (mode: 100644) (index 21d8785..970faf7) |
... |
... |
$(S_DIR) \ |
7 |
7 |
$(OBJ_DIR) \ |
$(OBJ_DIR) \ |
8 |
8 |
$(MODULES_DIR) \ |
$(MODULES_DIR) \ |
9 |
9 |
$(CPIO_DIR)/dev \ |
$(CPIO_DIR)/dev \ |
10 |
|
$(CPIO_DIR)/proc \ |
|
11 |
|
$(CPIO_DIR)/sys |
|
|
10 |
|
$(CPIO_DIR)/newroot |
12 |
11 |
|
|
13 |
12 |
|
|
14 |
13 |
OBJS=\ |
OBJS=\ |
|
... |
... |
$(OBJ_DIR)/modules.o \ |
17 |
16 |
$(OBJ_DIR)/uevents.o \ |
$(OBJ_DIR)/uevents.o \ |
18 |
17 |
$(OBJ_DIR)/uevent.o |
$(OBJ_DIR)/uevent.o |
19 |
18 |
|
|
20 |
|
ifdef DEBUG |
|
21 |
19 |
ULINUX_DEBUG_OBJS=\ |
ULINUX_DEBUG_OBJS=\ |
|
20 |
|
$(OBJ_DIR)/decimal.o |
|
21 |
|
|
|
22 |
|
ifdef DEBUG |
|
23 |
|
ULINUX_DEBUG_OBJS+= \ |
22 |
24 |
$(OBJ_DIR)/mem.o \ |
$(OBJ_DIR)/mem.o \ |
23 |
25 |
$(OBJ_DIR)/string.o \ |
$(OBJ_DIR)/string.o \ |
24 |
26 |
$(OBJ_DIR)/vsprintf.o |
$(OBJ_DIR)/vsprintf.o |
|
27 |
|
endif |
25 |
28 |
|
|
26 |
29 |
OBJS+= $(ULINUX_DEBUG_OBJS) |
OBJS+= $(ULINUX_DEBUG_OBJS) |
27 |
|
endif |
|
28 |
30 |
|
|
29 |
31 |
help: |
help: |
30 |
32 |
@echo "targets are 'all', 'help'(this output), 'clean'" |
@echo "targets are 'all', 'help'(this output), 'clean'" |
|
... |
... |
$(OBJ_DIR)/vsprintf.o:$(S_DIR)/vsprintf.s |
63 |
65 |
endif |
endif |
64 |
66 |
#=============================================================================== |
#=============================================================================== |
65 |
67 |
|
|
|
68 |
|
$(S_DIR)/decimal.s:ulinux/utils/ascii/string/conv/decimal/decimal.c |
|
69 |
|
$(CC) $(CFLAGS) $< -o $@ |
|
70 |
|
$(OBJ_DIR)/decimal.o:$(S_DIR)/decimal.s |
|
71 |
|
$(AS) $(ASFLAGS) $< -o $@ |
|
72 |
|
|
66 |
73 |
$(CPIO_DIR)/dev/console: |
$(CPIO_DIR)/dev/console: |
67 |
74 |
mknod --mode=0600 $(CPIO_DIR)/dev/console c 5 1 |
mknod --mode=0600 $(CPIO_DIR)/dev/console c 5 1 |
68 |
75 |
|
|
File uevent.c changed (mode: 100644) (index 12ec719..80d22b4) |
5 |
5 |
//****************************************************************************** |
//****************************************************************************** |
6 |
6 |
#include <ulinux/compiler_types.h> |
#include <ulinux/compiler_types.h> |
7 |
7 |
#include <ulinux/types.h> |
#include <ulinux/types.h> |
|
8 |
|
#include <ulinux/stat.h> |
|
9 |
|
#include <ulinux/error.h> |
|
10 |
|
#include <ulinux/utils/ascii/string/conv/decimal/decimal.h> |
|
11 |
|
#include <ulinux/utils/mem.h> |
|
12 |
|
#ifdef DEBUG |
|
13 |
|
#include <ulinux/sysc.h> |
|
14 |
|
#include <stdarg.h> |
|
15 |
|
#include <ulinux/utils/ascii/string/vsprintf.h> |
|
16 |
|
#endif |
8 |
17 |
|
|
9 |
18 |
#include "globals.h" |
#include "globals.h" |
10 |
19 |
|
|
|
20 |
|
static void root_mknod(k_u16 major,k_u32 minor) |
|
21 |
|
{ |
|
22 |
|
OUT(PRE "creating root device node:%s major=%u minor=%u...","/dev/" ROOT, |
|
23 |
|
major,minor); |
|
24 |
|
k_l r=sysc(mknod,3,"/dev/" ROOT,K_S_IFBLK|K_S_IRUSR|K_S_IWUSR|K_S_IRGRP |
|
25 |
|
|K_S_IWGRP, |
|
26 |
|
(minor&0xff)|(major<<8)|((minor&~0xff)<< 12)); |
|
27 |
|
if(K_ISERR(r)){ |
|
28 |
|
OUT("ERROR(%ld):unable to create the root node\n",r); |
|
29 |
|
sysc(exit_group,1,-1); |
|
30 |
|
} |
|
31 |
|
OUTC("done\n"); |
|
32 |
|
} |
|
33 |
|
|
|
34 |
|
static k_ut hdr_action_is_add(k_u8 *hdr) |
|
35 |
|
{ |
|
36 |
|
#define HDR_ACTION_ADD "add@" |
|
37 |
|
if(u_memcmp(hdr,(k_u8*)HDR_ACTION_ADD,sizeof(HDR_ACTION_ADD)-1)) return 0; |
|
38 |
|
return 1; |
|
39 |
|
} |
|
40 |
|
|
|
41 |
|
static void hdr_skip(k_u8 **p) |
|
42 |
|
{ |
|
43 |
|
while(*(*p)++); |
|
44 |
|
} |
|
45 |
|
#define var_skip hdr_skip |
|
46 |
|
|
|
47 |
|
static k_ut key_is_subsystem(k_u8 *p) |
|
48 |
|
{ |
|
49 |
|
#define KEY_SUBSYSTEM "SUBSYSTEM=" |
|
50 |
|
if(u_memcmp(p,(k_u8*)KEY_SUBSYSTEM,sizeof(KEY_SUBSYSTEM)-1)) return 0; |
|
51 |
|
return 1; |
|
52 |
|
} |
|
53 |
|
|
|
54 |
|
static k_ut key_is_devname(k_u8 *p) |
|
55 |
|
{ |
|
56 |
|
#define KEY_DEVNAME "DEVNAME=" |
|
57 |
|
if(u_memcmp(p,(k_u8*)KEY_DEVNAME,sizeof(KEY_DEVNAME)-1)) return 0; |
|
58 |
|
return 1; |
|
59 |
|
} |
|
60 |
|
|
|
61 |
|
static k_ut key_is_major(k_u8 *p) |
|
62 |
|
{ |
|
63 |
|
#define KEY_MAJOR "MAJOR=" |
|
64 |
|
if(u_memcmp(p,(k_u8*)KEY_MAJOR,sizeof(KEY_MAJOR)-1)) return 0; |
|
65 |
|
return 1; |
|
66 |
|
} |
|
67 |
|
|
|
68 |
|
static k_ut key_is_minor(k_u8 *p) |
|
69 |
|
{ |
|
70 |
|
#define KEY_MINOR "MINOR=" |
|
71 |
|
if(u_memcmp(p,(k_u8*)KEY_MINOR,sizeof(KEY_MINOR)-1)) return 0; |
|
72 |
|
return 1; |
|
73 |
|
} |
|
74 |
|
|
|
75 |
|
static void move_to_value(k_u8 **p) |
|
76 |
|
{ |
|
77 |
|
while(*(*p)++!='='); |
|
78 |
|
} |
|
79 |
|
|
|
80 |
|
static k_ut value_is_block(k_u8 *p) |
|
81 |
|
{ |
|
82 |
|
#define VALUE_BLOCK "block" |
|
83 |
|
if(!*p||u_memcmp(p,(k_u8*)VALUE_BLOCK,sizeof(VALUE_BLOCK)-1)) return 0; |
|
84 |
|
return 1; |
|
85 |
|
} |
|
86 |
|
|
|
87 |
|
static void value_skip(k_u8 **p) |
|
88 |
|
{ |
|
89 |
|
while(*(*p)++); |
|
90 |
|
} |
|
91 |
|
|
|
92 |
|
static void value_str_consume(k_u8 **p,k_u8 *d) |
|
93 |
|
{ |
|
94 |
|
do *d++=**p; while(*(*p)++); |
|
95 |
|
} |
|
96 |
|
|
11 |
97 |
void uevent_process(k_u8 *p,k_i sz) |
void uevent_process(k_u8 *p,k_i sz) |
12 |
98 |
{ |
{ |
13 |
|
while(sz){ |
|
14 |
|
++p; |
|
15 |
|
sz--; |
|
|
99 |
|
if(!hdr_action_is_add(p)) return; |
|
100 |
|
k_u8 *p_end=p+sz; |
|
101 |
|
hdr_skip(&p); |
|
102 |
|
|
|
103 |
|
k_u8 dev_name[256]; |
|
104 |
|
u_memset(dev_name,0,sizeof(dev_name)); |
|
105 |
|
k_u16 major=0; |
|
106 |
|
k_u32 minor=0; |
|
107 |
|
|
|
108 |
|
while(p<p_end){ |
|
109 |
|
if(key_is_subsystem(p)){ |
|
110 |
|
move_to_value(&p); |
|
111 |
|
if(!value_is_block(p)) return; |
|
112 |
|
else value_skip(&p); |
|
113 |
|
}else if(key_is_devname(p)){ |
|
114 |
|
move_to_value(&p); |
|
115 |
|
value_str_consume(&p,dev_name); |
|
116 |
|
}else if(key_is_major(p)){ |
|
117 |
|
move_to_value(&p); |
|
118 |
|
if(!u_a_strict_dec2u16(&major,p)){ |
|
119 |
|
OUT(PRE "ERROR:unable to convert major '%s'\n",p); |
|
120 |
|
sysc(exit_group,1,-1); |
|
121 |
|
} |
|
122 |
|
value_skip(&p); |
|
123 |
|
}else if(key_is_minor(p)){ |
|
124 |
|
move_to_value(&p); |
|
125 |
|
if(!u_a_strict_dec2u32(&minor,p)){ |
|
126 |
|
OUT(PRE "ERROR:unable to convert minor '%s'\n",p); |
|
127 |
|
sysc(exit_group,1,-1); |
|
128 |
|
} |
|
129 |
|
value_skip(&p); |
|
130 |
|
}else var_skip(&p); |
|
131 |
|
} |
|
132 |
|
|
|
133 |
|
if(!u_memcmp(dev_name,(k_u8*)ROOT,sizeof(ROOT)-1)){ |
|
134 |
|
root_mknod(major,minor); |
16 |
135 |
} |
} |
17 |
136 |
} |
} |
File uevents.c changed (mode: 100644) (index 1684f9b..32961ea) |
... |
... |
static k_i s; |
30 |
30 |
void uevents_setup(void) |
void uevents_setup(void) |
31 |
31 |
{ |
{ |
32 |
32 |
OUTC(PRE "setting up uevent..."); |
OUTC(PRE "setting up uevent..."); |
33 |
|
ep_fd=(k_i)sysc(epoll_create1,1,0); |
|
|
33 |
|
ep_fd=(k_i)sysc(epoll_create1,1,K_EPOLL_CLOEXEC); |
34 |
34 |
if(K_ISERR(ep_fd)){ |
if(K_ISERR(ep_fd)){ |
35 |
35 |
OUT("ERROR(%d):unable to create epoll fd\n",ep_fd); |
OUT("ERROR(%d):unable to create epoll fd\n",ep_fd); |
36 |
36 |
sysc(exit_group,1,-1); |
sysc(exit_group,1,-1); |
|
... |
... |
void uevents_setup(void) |
39 |
39 |
//---------------------------------------------------------------------------- |
//---------------------------------------------------------------------------- |
40 |
40 |
|
|
41 |
41 |
//blocking socket |
//blocking socket |
42 |
|
s=(k_i)sysc(socket,3,K_PF_NETLINK,K_SOCK_RAW,K_NETLINK_KOBJECT_UEVENT); |
|
|
42 |
|
s=(k_i)sysc(socket,3,K_PF_NETLINK,K_SOCK_RAW|K_SO_CLOEXEC, |
|
43 |
|
K_NETLINK_KOBJECT_UEVENT); |
43 |
44 |
if(K_ISERR(s)){ |
if(K_ISERR(s)){ |
44 |
45 |
OUT("ERROR(%d):unable to create uevent netlink socket\n",s); |
OUT("ERROR(%d):unable to create uevent netlink socket\n",s); |
45 |
46 |
sysc(exit_group,1,-1); |
sysc(exit_group,1,-1); |
|
... |
... |
void uevents_process(void) |
116 |
117 |
static struct k_epoll_event evts;//uevent netlink event |
static struct k_epoll_event evts;//uevent netlink event |
117 |
118 |
do{ |
do{ |
118 |
119 |
u_memset(&evts,0,sizeof(evts)); |
u_memset(&evts,0,sizeof(evts)); |
119 |
|
r=sysc(epoll_wait,4,ep_fd,&evts,1,-1); |
|
|
120 |
|
r=sysc(epoll_wait,4,ep_fd,&evts,1,UEVENTS_TIMEOUT); |
120 |
121 |
}while(r==-K_EINTR); |
}while(r==-K_EINTR); |
121 |
122 |
if(K_ISERR(r)){ |
if(K_ISERR(r)){ |
122 |
123 |
OUT(PRE "ERROR(%ld):error epolling uevent netlink socket\n",r); |
OUT(PRE "ERROR(%ld):error epolling uevent netlink socket\n",r); |
File ulinux/archs/x86_64/utils/mem.c changed (mode: 100644) (index 366278a..2bb737b) |
8 |
8 |
#include <stddef.h> |
#include <stddef.h> |
9 |
9 |
|
|
10 |
10 |
//XXX:need a way to get the target CPUID flags in order to select the proper |
//XXX:need a way to get the target CPUID flags in order to select the proper |
11 |
|
//path at compilation time and not runtime |
|
|
11 |
|
//code path at compilation time and not runtime |
12 |
12 |
void u_memcpy(void *d,void *s,k_ul len) |
void u_memcpy(void *d,void *s,k_ul len) |
13 |
13 |
{ |
{ |
14 |
14 |
__builtin_memcpy(d,s,len);//use gcc builtin for this arch |
__builtin_memcpy(d,s,len);//use gcc builtin for this arch |
|
... |
... |
void *memset(void *to,int c,size_t len) |
35 |
35 |
while(len--) *d++=c; |
while(len--) *d++=c; |
36 |
36 |
return to; |
return to; |
37 |
37 |
} |
} |
|
38 |
|
|
|
39 |
|
k_t u_memcmp(void *d,void *c,k_ul len) |
|
40 |
|
{ |
|
41 |
|
return __builtin_memcmp(d,c,len);//use gcc builtin for this arch |
|
42 |
|
} |
|
43 |
|
|
|
44 |
|
//a memset implementation is needed anyway if gcc decides not to use its builtin |
|
45 |
|
//stolen from linux |
|
46 |
|
int memcmp(const void *cs,const void *ct,size_t count) |
|
47 |
|
{ |
|
48 |
|
const k_u8 *su1,*su2; |
|
49 |
|
k_i res=0; |
|
50 |
|
|
|
51 |
|
for(su1=cs,su2=ct;0<count;++su1,++su2,count--) if((res=*su1-*su2)!=0) break; |
|
52 |
|
return res; |
|
53 |
|
} |
File ulinux/archs/x86_64/utils/mem.h changed (mode: 100644) (index 32a51cc..f8b39e5) |
2 |
2 |
#define ULINUX_ARCH_UTILS_MEM_H |
#define ULINUX_ARCH_UTILS_MEM_H |
3 |
3 |
#define ULINUX_ARCH_HAS_MEMCPY |
#define ULINUX_ARCH_HAS_MEMCPY |
4 |
4 |
#define ULINUX_ARCH_HAS_MEMSET |
#define ULINUX_ARCH_HAS_MEMSET |
|
5 |
|
#define ULINUX_ARCH_HAS_MEMCMP |
5 |
6 |
void u_memcpy(void *d,void *s,k_ul len); |
void u_memcpy(void *d,void *s,k_ul len); |
6 |
7 |
void u_memset(void *d,k_u8 c,k_ul len); |
void u_memset(void *d,k_u8 c,k_ul len); |
|
8 |
|
k_t u_memcmp(void *s1,void *s2,k_ul len); |
7 |
9 |
#endif |
#endif |
File ulinux/epoll.h changed (mode: 100644) (index 37421c3..4a56407) |
5 |
5 |
//*author:Sylvain BERTRAND <sylvain.bertrand AT gmail dot com> |
//*author:Sylvain BERTRAND <sylvain.bertrand AT gmail dot com> |
6 |
6 |
//* <digital.ragnarok AT gmail dot com> |
//* <digital.ragnarok AT gmail dot com> |
7 |
7 |
//****************************************************************************** |
//****************************************************************************** |
|
8 |
|
#define K_EPOLL_CLOEXEC 02000000//same than K_O_CLOEXEC |
|
9 |
|
|
8 |
10 |
#define K_EPOLL_CTL_ADD 1 |
#define K_EPOLL_CTL_ADD 1 |
9 |
11 |
#define K_EPOLL_CTL_DEL 2 |
#define K_EPOLL_CTL_DEL 2 |
10 |
12 |
#define K_EPOLL_CTL_MOD 3 |
#define K_EPOLL_CTL_MOD 3 |
File ulinux/utils/ascii/block/conv/decimal/decimal.c changed (mode: 100644) (index 42f56fb..594f7e0) |
1 |
|
//********************************************************************************************** |
|
|
1 |
|
//****************************************************************************** |
2 |
2 |
//*this code is protected by the GNU affero GPLv3 |
//*this code is protected by the GNU affero GPLv3 |
3 |
3 |
//*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com) |
//*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com) |
4 |
|
//********************************************************************************************** |
|
|
4 |
|
//* <digital.ragnarok AT gmail dot com> |
|
5 |
|
//****************************************************************************** |
5 |
6 |
#include <ulinux/compiler_types.h> |
#include <ulinux/compiler_types.h> |
6 |
7 |
#include <ulinux/arch/types.h> |
#include <ulinux/arch/types.h> |
7 |
8 |
|
|
|
... |
... |
k_ut u_a_strict_dec2u8_blk(k_u8 *dest,k_u8 *start,k_u8 *end) |
20 |
21 |
buf=buf*10+(*start-'0'); |
buf=buf*10+(*start-'0'); |
21 |
22 |
++start; |
++start; |
22 |
23 |
} |
} |
23 |
|
if(buf&0xff00) return 0;//overflow, max is 999 way below what can do a u16 |
|
|
24 |
|
//overflow, max is 999 way below what can do a u16 |
|
25 |
|
if(buf&0xff00) return 0; |
24 |
26 |
*dest=(k_u8)buf; |
*dest=(k_u8)buf; |
25 |
27 |
return 1; |
return 1; |
26 |
28 |
} |
} |
27 |
29 |
|
|
28 |
|
//strict unisgned decimal ascii block to u16 |
|
|
30 |
|
//strict unsigned decimal ascii block to u16 |
29 |
31 |
//C version |
//C version |
30 |
32 |
//caller must provide a valid memory block |
//caller must provide a valid memory block |
31 |
33 |
//inplace conversion: ok |
//inplace conversion: ok |
|
... |
... |
k_ut u_a_strict_dec2u16_blk(k_u16 *dest,k_u8 *start,k_u8 *end) |
39 |
41 |
buf=buf*10+(*start-'0'); |
buf=buf*10+(*start-'0'); |
40 |
42 |
++start; |
++start; |
41 |
43 |
} |
} |
42 |
|
if(buf&0xffff0000) return 0;//overflow, max is 99999 way below what can do a u32 |
|
43 |
|
*dest=buf; |
|
|
44 |
|
//overflow, max is 99999 way below what can do a u32 |
|
45 |
|
if(buf&0xffff0000) return 0; |
|
46 |
|
*dest=(k_u16)buf; |
|
47 |
|
return 1; |
|
48 |
|
} |
|
49 |
|
|
|
50 |
|
//strict unsigned decimal ascii block to u32 |
|
51 |
|
//C version |
|
52 |
|
//caller must provide a valid memory block |
|
53 |
|
//inplace conversion: ok |
|
54 |
|
//return compiler boolean:success or failed |
|
55 |
|
k_ut u_a_strict_dec2u32_blk(k_u32 *dest,k_u8 *start,k_u8 *end) |
|
56 |
|
{//do *not* trust content |
|
57 |
|
if((k_ul)(end-start)>=sizeof("4294967295")-1) return 0; |
|
58 |
|
k_u64 buf=0; |
|
59 |
|
while(start<=end){ |
|
60 |
|
if(!u_a_is_digit(*start)) return 0; |
|
61 |
|
buf=buf*10+(*start-'0'); |
|
62 |
|
++start; |
|
63 |
|
} |
|
64 |
|
//overflow, max is 9999999999 way below what can do a u64 |
|
65 |
|
if(buf&0xffffffff00000000) return 0; |
|
66 |
|
*dest=(k_u32)buf; |
44 |
67 |
return 1; |
return 1; |
45 |
68 |
} |
} |
46 |
69 |
|
|
File ulinux/utils/ascii/block/conv/decimal/decimal.h changed (mode: 100644) (index 1ee3713..263a98b) |
1 |
|
//********************************************************************************************** |
|
|
1 |
|
//****************************************************************************** |
2 |
2 |
//*this code is protected by the GNU affero GPLv3 |
//*this code is protected by the GNU affero GPLv3 |
3 |
3 |
//*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com) |
//*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com) |
4 |
|
//********************************************************************************************** |
|
|
4 |
|
//* <digital.ragnarok AT gmail dot com> |
|
5 |
|
//****************************************************************************** |
5 |
6 |
#ifndef ULINUX_UTILS_ASCII_BLOCK_CONV_DECIMAL_DECIMAL_H |
#ifndef ULINUX_UTILS_ASCII_BLOCK_CONV_DECIMAL_DECIMAL_H |
6 |
7 |
#define ULINUX_UTILS_ASCII_BLOCK_CONV_DECIMAL_DECIMAL_H |
#define ULINUX_UTILS_ASCII_BLOCK_CONV_DECIMAL_DECIMAL_H |
7 |
8 |
extern k_ut u_a_strict_dec2u8_blk(k_u8 *dest,k_u8 *start,k_u8 *end); |
extern k_ut u_a_strict_dec2u8_blk(k_u8 *dest,k_u8 *start,k_u8 *end); |
8 |
9 |
extern k_ut u_a_strict_dec2u16_blk(k_u16 *dest,k_u8 *start,k_u8 *end); |
extern k_ut u_a_strict_dec2u16_blk(k_u16 *dest,k_u8 *start,k_u8 *end); |
|
10 |
|
extern k_ut u_a_strict_dec2u32_blk(k_u32 *dest,k_u8 *start,k_u8 *end); |
9 |
11 |
extern k_ut u_a_strict_dec2u64_blk(k_u64 *dest,k_u8 *start,k_u8 *end); |
extern k_ut u_a_strict_dec2u64_blk(k_u64 *dest,k_u8 *start,k_u8 *end); |
10 |
12 |
#endif |
#endif |
File ulinux/utils/ascii/string/conv/decimal/decimal.c changed (mode: 100644) (index 80839d3..fa6ed9b) |
1 |
|
//********************************************************************************************** |
|
|
1 |
|
//****************************************************************************** |
2 |
2 |
//*this code is protected by the GNU affero GPLv3 |
//*this code is protected by the GNU affero GPLv3 |
3 |
3 |
//*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com) |
//*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com) |
4 |
|
//********************************************************************************************** |
|
|
4 |
|
//* <digital.ragnarok AT gmail dot com> |
|
5 |
|
//****************************************************************************** |
5 |
6 |
|
|
6 |
7 |
#include <ulinux/compiler_types.h> |
#include <ulinux/compiler_types.h> |
7 |
8 |
#include <ulinux/arch/types.h> |
#include <ulinux/arch/types.h> |
|
... |
... |
k_ut u_a_strict_dec2u16(k_u16 *dest,k_u8 *start) |
26 |
27 |
buf=buf*10+(*start-'0'); |
buf=buf*10+(*start-'0'); |
27 |
28 |
++start; |
++start; |
28 |
29 |
} |
} |
29 |
|
if(buf&0xffff0000) return 0;//overflow, max is 99999 way below what can do a u32 |
|
|
30 |
|
//overflow, max is 99999 way below what can do a u32 |
|
31 |
|
if(buf&0xffff0000) return 0; |
30 |
32 |
*dest=(k_u16)buf; |
*dest=(k_u16)buf; |
31 |
33 |
return 1; |
return 1; |
32 |
34 |
} |
} |
33 |
35 |
|
|
|
36 |
|
//strict unsigned decimal ascii str to u32 |
|
37 |
|
//C version |
|
38 |
|
//caller must provide a valid pointer with readable data |
|
39 |
|
//inplace conversion: ok |
|
40 |
|
//return compiler boolean:success or failed |
|
41 |
|
k_ut u_a_strict_dec2u32(k_u32 *dest,k_u8 *start) |
|
42 |
|
{//do *not* trust |
|
43 |
|
k_ul len; |
|
44 |
|
if(!u_a_strnlen(&len,start,sizeof("4294967295")-1)) return 0; |
|
45 |
|
if(!len) return 0; |
|
46 |
|
|
|
47 |
|
k_u64 buf=0; |
|
48 |
|
k_u8 *end=start+len-1; |
|
49 |
|
while(start<=end){ |
|
50 |
|
if(!u_a_is_digit(*start)) return 0; |
|
51 |
|
buf=buf*10+(*start-'0'); |
|
52 |
|
++start; |
|
53 |
|
} |
|
54 |
|
//overflow, max is 9999999999 way below what can do a u32 |
|
55 |
|
if(buf&0xffffffff00000000) return 0; |
|
56 |
|
*dest=(k_u32)buf; |
|
57 |
|
return 1; |
|
58 |
|
} |
|
59 |
|
|
34 |
60 |
//strict unsigned decimal ascii str to u64 |
//strict unsigned decimal ascii str to u64 |
35 |
61 |
//C version |
//C version |
36 |
62 |
//caller must provide a valid pointer with readable data |
//caller must provide a valid pointer with readable data |
File ulinux/utils/ascii/string/conv/decimal/decimal.h changed (mode: 100644) (index bbf2599..4da3c40) |
1 |
|
//********************************************************************************************** |
|
|
1 |
|
//****************************************************************************** |
2 |
2 |
//*this code is protected by the GNU affero GPLv3 |
//*this code is protected by the GNU affero GPLv3 |
3 |
3 |
//*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com) |
//*author:Sylvain BERTRAND (sylvain.bertrand AT gmail dot com) |
4 |
|
//********************************************************************************************** |
|
|
4 |
|
//* <digital.ragnarok AT gmail dot com> |
|
5 |
|
//****************************************************************************** |
5 |
6 |
#ifndef ULINUX_UTILS_ASCII_STRING_CONV_DECIMAL_DECIMAL_H |
#ifndef ULINUX_UTILS_ASCII_STRING_CONV_DECIMAL_DECIMAL_H |
6 |
7 |
#define ULINUX_UTILS_ASCII_STRING_CONV_DECIMAL_DECIMAL_H |
#define ULINUX_UTILS_ASCII_STRING_CONV_DECIMAL_DECIMAL_H |
7 |
8 |
extern k_ut u_a_strict_dec2u16(k_u16 *dest,k_u8 *start); |
extern k_ut u_a_strict_dec2u16(k_u16 *dest,k_u8 *start); |
|
9 |
|
extern k_ut u_a_strict_dec2u32(k_u32 *dest,k_u8 *start); |
8 |
10 |
extern k_ut u_a_strict_dec2u64(k_u64 *dest,k_u8 *start); |
extern k_ut u_a_strict_dec2u64(k_u64 *dest,k_u8 *start); |
9 |
11 |
#endif |
#endif |