ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/dinfo/dinfo.xs
Revision: 1.4
Committed: Wed Sep 3 23:45:19 2003 UTC (20 years, 8 months ago) by root
Branch: MAIN
CVS Tags: HEAD
Changes since 1.3: +5 -1 lines
Log Message:
*** empty log message ***

File Contents

# Content
1 #include "EXTERN.h"
2 #include "perl.h"
3 #include "XSUB.h"
4
5 MODULE = dinfo PACKAGE = dinfo
6
7 PROTOTYPES: ENABLE
8
9 void
10 nummer2str (char *nummer, int fill = 10)
11 PPCODE:
12 int len;
13 unsigned long long num;
14 char bin[5];
15
16 for (len = num = 0; *nummer && len < 11; nummer++)
17 if (*nummer >= '0' && *nummer <= '9')
18 {
19 len++;
20 num = num * 11 + *nummer - '0';
21 }
22
23 while (len++ < 11)
24 num = num * 11 + fill;
25
26 bin[0] = num >> 32;
27 bin[1] = (unsigned int)num >> 24;
28 bin[2] = (unsigned int)num >> 16;
29 bin[3] = (unsigned int)num >> 8;
30 bin[4] = (unsigned int)num >> 0;
31
32 len = 5;
33 while (--len && bin[len] == ' ')
34 bin[len] = '0';
35
36 XPUSHs (sv_2mortal (newSVpvn (bin, len + 1)));
37
38 SV *
39 str2nummer (SV *str)
40 CODE:
41 STRLEN len;
42 int i;
43 unsigned char *bin = (unsigned char *)SvPV (str, len);
44 char nummer[12];
45 unsigned long long num;
46
47 num = (((unsigned long long)(len > 0 ? bin[0] : ' ')) << 32)
48 | (((unsigned long long)(len > 1 ? bin[1] : ' ')) << 24)
49 | (((unsigned long long)(len > 2 ? bin[2] : ' ')) << 16)
50 | (((unsigned long long)(len > 3 ? bin[3] : ' ')) << 8)
51 | (((unsigned long long)(len > 4 ? bin[4] : ' ')) << 0);
52
53 nummer[11] = 0;
54 for (len = 11, i = 11; i--; )
55 {
56 nummer[i] = "0123456789"[num % 11];
57 num /= 11;
58 }
59
60 RETVAL = newSVpv (nummer, 0);
61 OUTPUT:
62 RETVAL