ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/dinfo/dinfo.xs
Revision: 1.3
Committed: Fri Aug 29 20:17:57 2003 UTC (23 years ago) by root
Branch: MAIN
Changes since 1.2: +25 -0 lines
Log Message:
*** empty log message ***

File Contents

# User Rev Content
1 root 1.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 root 1.2 nummer2str (char *nummer, int fill = 10)
11 root 1.1 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     XPUSHs (sv_2mortal (newSVpvn (bin, 5)));
33    
34 root 1.3 SV *
35     str2nummer (SV *str)
36     CODE:
37     STRLEN len;
38     int i;
39     unsigned char *bin = (unsigned char *)SvPV (str, len);
40     char nummer[12];
41     unsigned long long num;
42    
43     num = (((unsigned long long)(len > 0 ? bin[0] : ' ')) << 32)
44     | (((unsigned long long)(len > 1 ? bin[1] : ' ')) << 24)
45     | (((unsigned long long)(len > 2 ? bin[2] : ' ')) << 16)
46     | (((unsigned long long)(len > 3 ? bin[3] : ' ')) << 8)
47     | (((unsigned long long)(len > 4 ? bin[4] : ' ')) << 0);
48    
49     nummer[11] = 0;
50     for (len = 11, i = 11; i--; )
51     {
52     nummer[i] = "0123456789"[num % 11];
53     num /= 11;
54     }
55    
56     RETVAL = newSVpv (nummer, 0);
57     OUTPUT:
58     RETVAL