After the #6519 a warning about stat() is just that,
[p5sagit/p5-mst-13.2.git] / os2 / OS2 / PrfDB / PrfDB.xs
CommitLineData
760ac839 1#define INCL_WINSHELLDATA /* Or use INCL_WIN, INCL_PM, */
2
3#ifdef __cplusplus
4extern "C" {
5#endif
6#include "EXTERN.h"
7#include "perl.h"
8#include "XSUB.h"
9#include <os2.h>
10#ifdef __cplusplus
11}
12#endif
13
14#define Prf_Open(pszFileName) SaveWinError(PrfOpenProfile(Perl_hab, (pszFileName)))
15#define Prf_Close(hini) (!CheckWinError(PrfCloseProfile(hini)))
16
17SV *
41cd3736 18Prf_Get(pTHX_ HINI hini, PSZ app, PSZ key) {
760ac839 19 ULONG len;
20 BOOL rc;
21 SV *sv;
22
6b88bc9c 23 if (CheckWinError(PrfQueryProfileSize(hini, app, key, &len))) return &PL_sv_undef;
760ac839 24 sv = newSVpv("", 0);
dd96f567 25 SvGROW(sv, len + 1);
760ac839 26 if (CheckWinError(PrfQueryProfileData(hini, app, key, SvPVX(sv), &len))
27 || (len == 0 && (app == NULL || key == NULL))) { /* Somewhy needed. */
28 SvREFCNT_dec(sv);
6b88bc9c 29 return &PL_sv_undef;
760ac839 30 }
31 SvCUR_set(sv, len);
32 *SvEND(sv) = 0;
33 return sv;
34}
35
4e3d4845 36I32
760ac839 37Prf_GetLength(HINI hini, PSZ app, PSZ key) {
38 U32 len;
39
40 if (CheckWinError(PrfQueryProfileSize(hini, app, key, &len))) return -1;
41 return len;
42}
43
44#define Prf_Set(hini, app, key, s, l) \
45 (!(CheckWinError(PrfWriteProfileData(hini, app, key, s, l))))
46
47#define Prf_System(key) \
48 ( (key) ? ( (key) == 1 ? HINI_USERPROFILE \
49 : ( (key) == 2 ? HINI_SYSTEMPROFILE \
50 : (die("Wrong profile id %i", key), 0) )) \
51 : HINI_PROFILE)
52
53SV*
41cd3736 54Prf_Profiles(pTHX)
760ac839 55{
56 AV *av = newAV();
57 SV *rv;
58 char user[257];
59 char system[257];
60 PRFPROFILE info = { 257, user, 257, system};
61
6b88bc9c 62 if (CheckWinError(PrfQueryProfile(Perl_hab, &info))) return &PL_sv_undef;
760ac839 63 if (info.cchUserName > 257 || info.cchSysName > 257)
64 die("Panic: Profile names too long");
65 av_push(av, newSVpv(user, info.cchUserName - 1));
66 av_push(av, newSVpv(system, info.cchSysName - 1));
67 rv = newRV((SV*)av);
68 SvREFCNT_dec(av);
69 return rv;
70}
71
72BOOL
41cd3736 73Prf_SetUser(pTHX_ SV *sv)
760ac839 74{
75 char user[257];
76 char system[257];
77 PRFPROFILE info = { 257, user, 257, system};
78
79 if (!SvPOK(sv)) die("User profile name not defined");
80 if (SvCUR(sv) > 256) die("User profile name too long");
81 if (CheckWinError(PrfQueryProfile(Perl_hab, &info))) return 0;
82 if (info.cchSysName > 257)
83 die("Panic: System profile name too long");
84 info.cchUserName = SvCUR(sv) + 1;
85 info.pszUserName = SvPVX(sv);
86 return !CheckWinError(PrfReset(Perl_hab, &info));
87}
88
89MODULE = OS2::PrfDB PACKAGE = OS2::Prf PREFIX = Prf_
90
91HINI
92Prf_Open(pszFileName)
93 PSZ pszFileName;
94
95BOOL
96Prf_Close(hini)
97 HINI hini;
98
99SV *
100Prf_Get(hini, app, key)
101 HINI hini;
102 PSZ app;
103 PSZ key;
41cd3736 104CODE:
105 RETVAL = Prf_Get(aTHX_ hini, app, key);
106OUTPUT:
107 RETVAL
760ac839 108
109int
110Prf_Set(hini, app, key, s, l = (SvPOK(ST(3)) ? SvCUR(ST(3)): -1))
111 HINI hini;
112 PSZ app;
113 PSZ key;
114 PSZ s;
115 ULONG l;
116
4e3d4845 117I32
760ac839 118Prf_GetLength(hini, app, key)
119 HINI hini;
120 PSZ app;
121 PSZ key;
122
123HINI
124Prf_System(key)
125 int key;
126
127SV*
128Prf_Profiles()
41cd3736 129CODE:
130 RETVAL = Prf_Profiles(aTHX);
131OUTPUT:
132 RETVAL
760ac839 133
134BOOL
135Prf_SetUser(sv)
136 SV *sv
41cd3736 137CODE:
138 RETVAL = Prf_SetUser(aTHX_ sv);
139OUTPUT:
140 RETVAL
760ac839 141
142BOOT:
143 Acquire_hab();