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

# 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 root 1.4 len = 5;
33     while (--len && bin[len] == ' ')
34     bin[len] = '0';
35    
36     XPUSHs (sv_2mortal (newSVpvn (bin, len + 1)));
37 root 1.1
38 root 1.3 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