gpps.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:10k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. // GetPrivateProfileString() -- approximate implementation of
  2. // Windows NT System Services version of GetPrivateProfileString()
  3. // probably doesn't handle the NULL key for section name or value key
  4. // correctly also, doesn't provide Microsoft backwards compatability
  5. // wrt TAB characters in the value string -- Microsoft terminates value
  6. // at the first TAB, but I couldn't discover what the behavior should
  7. // be regarding TABS in quoted strings so, I treat tabs like any other
  8. // characters -- NO comments following value string separated by a TAB
  9. // are allowed (that is an anachronism anyway)
  10. // Added code to search for ODBC_INI file in users home directory on
  11. // Unix
  12. #ifndef WIN32
  13. #if HAVE_CONFIG_H
  14. #include "config.h" // produced by configure
  15. #endif
  16. #include <stdio.h>
  17. #include <unistd.h>
  18. #include <ctype.h>
  19. #if HAVE_PWD_H
  20. #include <pwd.h>
  21. #endif
  22. #include <sys/types.h>
  23. #include <string.h>
  24. #include "gpps.h"
  25. #include "misc.h"
  26. #ifndef TRUE
  27. #define TRUE ((BOOL)1)
  28. #endif
  29. #ifndef FALSE
  30. #define FALSE ((BOOL)0)
  31. #endif
  32. #if HAVE_SYS_PARAM_H
  33. #include <sys/param.h>
  34. #else
  35. #define MAXPATHLEN 255
  36. #endif
  37. DWORD
  38. GetPrivateProfileString(char *theSection, // section name
  39. char *theKey, // search key name
  40. char *theDefault, // default value if not found
  41. char *theReturnBuffer, // return value stored here
  42. size_t theReturnBufferLength, // byte length of return buffer
  43. char *theIniFileName) // pathname of ini file to search
  44. {
  45. char buf[MAXPATHLEN+1];
  46. char* ptr = 0;
  47. FILE* aFile = 0;
  48. size_t aLength;
  49. char aLine[2048];
  50. char *aValue;
  51. char *aStart;
  52. char *aString;
  53. size_t aLineLength;
  54. size_t aReturnLength = 0;
  55. BOOL aSectionFound = FALSE;
  56. BOOL aKeyFound = FALSE;
  57. int j = 0;
  58. j = strlen(theIniFileName) + 1;
  59. ptr = (char*)getpwuid(getuid()); // get user info
  60. if( ptr == NULL)
  61. {
  62. if( MAXPATHLEN < j )
  63. theIniFileName[MAXPATHLEN] = '';
  64. sprintf(buf,"%s",theIniFileName);
  65. }
  66. ptr = ((struct passwd*)ptr)->pw_dir; // get user home dir
  67. if( ptr == NULL || *ptr == '' )
  68. ptr = "/home";
  69. /* This doesn't make it so we find an ini file but allows normal
  70.  * processing to continue further on down. The likelihood is that
  71.  * the file won't be found and thus the default value will be
  72.  * returned.
  73. */
  74. if( MAXPATHLEN < strlen(ptr) + j )
  75. {
  76. if( MAXPATHLEN < strlen(ptr) )
  77. ptr[MAXPATHLEN] = '';
  78. else
  79. theIniFileName[MAXPATHLEN-strlen(ptr)] = '';
  80. }
  81. sprintf( buf, "%s/%s",ptr,theIniFileName );
  82.   /* This code makes it so that a file in the users home dir
  83.    * overrides a the "default" file as passed in
  84.   */
  85. #ifndef __CYGWIN32__
  86. aFile = (FILE*)(buf ? fopen(buf, "r") : NULL);
  87. #else
  88. aFile = (FILE*)(buf ? fopen(buf, "rb") : NULL);
  89. #endif
  90. if(!aFile) {
  91. sprintf(buf,"%s",theIniFileName);
  92. #ifndef __CYGWIN32__
  93. aFile = (FILE*)(buf ? fopen(buf, "r") : NULL);
  94. #else
  95. aFile = (FILE*)(buf ? fopen(buf, "rb") : NULL);
  96. #endif
  97. }
  98. aLength = (theDefault == NULL) ? 0 : strlen(theDefault);
  99. if(theReturnBufferLength == 0 || theReturnBuffer == NULL)
  100. {
  101. if(aFile)
  102. {
  103. fclose(aFile);
  104. }
  105. return 0;
  106. }
  107. if(aFile == NULL)
  108. {
  109. // no ini file specified, return the default
  110. ++aLength; // room for NULL char
  111. aLength = theReturnBufferLength < aLength ?
  112. theReturnBufferLength : aLength;
  113. strncpy(theReturnBuffer, theDefault, aLength);
  114. theReturnBuffer[aLength - 1] = '';
  115. return aLength - 1;
  116. }
  117. while(fgets(aLine, sizeof(aLine), aFile) != NULL)
  118. {
  119. aLineLength = strlen(aLine);
  120. // strip final 'n'
  121. if(aLineLength > 0 && aLine[aLineLength - 1] == 'n')
  122. {
  123. aLine[aLineLength - 1] = '';
  124. }
  125. switch(*aLine)
  126. {
  127. case ' ': // blank line
  128. case ';': // comment line
  129. continue;
  130. break;
  131. case '[': // section marker
  132. if( (aString = strchr(aLine, ']')) )
  133. {
  134. aStart = aLine + 1;
  135. aString--;
  136. while (isspace(*aStart)) aStart++;
  137. while (isspace(*aString)) aString--;
  138. *(aString+1) = '';
  139. // accept as matched if NULL key or exact match
  140. if(!theSection || !strcmp(aStart, theSection))
  141. {
  142. aSectionFound = TRUE;
  143. }
  144. }
  145. break;
  146. default:
  147. // try to match value keys if in proper section
  148. if(aSectionFound)
  149. {
  150. // try to match requested key
  151. if( (aString = aValue = strchr(aLine, '=')) )
  152. {
  153. *aValue = '';
  154. ++aValue;
  155. // strip leading blanks in value field
  156. while(*aValue == ' ' && aValue < aLine + sizeof(aLine))
  157. {
  158. *aValue++ = '';
  159. }
  160. if(aValue >= aLine + sizeof(aLine))
  161. {
  162. aValue = "";
  163. }
  164. }
  165. else
  166. {
  167. aValue = "";
  168. }
  169. aStart = aLine;
  170. while(isspace(*aStart)) aStart++;
  171. // strip trailing blanks from key
  172. if(aString)
  173. {
  174. while(--aString >= aStart && *aString == ' ')
  175. {
  176. *aString = '';
  177. }
  178. }
  179. // see if key is matched
  180. if(theKey == NULL || !strcmp(theKey, aStart))
  181. {
  182. // matched -- first, terminate value part
  183. aKeyFound = TRUE;
  184. aLength = strlen(aValue);
  185. // remove trailing blanks from aValue if any
  186. aString = aValue + aLength - 1;
  187. while(--aString > aValue && *aString == ' ')
  188. {
  189. *aString = '';
  190. --aLength;
  191. }
  192. // unquote value if quoted
  193. if(aLength >= 2 && aValue[0] == '"' &&
  194. aValue[aLength - 1] == '"')
  195. {
  196. // string quoted with double quotes
  197. aValue[aLength - 1] = '';
  198. ++aValue;
  199. aLength -= 2;
  200. }
  201. else
  202. {
  203. // single quotes allowed also...
  204. if(aLength >= 2 && aValue[0] == ''' &&
  205. aValue[aLength - 1] == ''')
  206. {
  207. aValue[aLength - 1] = '';
  208. ++aValue;
  209. aLength -= 2;
  210. }
  211. }
  212. // compute maximum length copyable
  213. aLineLength = (aLength <
  214. theReturnBufferLength - aReturnLength) ? aLength :
  215. theReturnBufferLength - aReturnLength;
  216. // do the copy to return buffer
  217. if(aLineLength)
  218. {
  219. strncpy(&theReturnBuffer[aReturnLength],
  220. aValue, aLineLength);
  221. aReturnLength += aLineLength;
  222. if(aReturnLength < theReturnBufferLength)
  223. {
  224. theReturnBuffer[aReturnLength] = '';
  225. ++aReturnLength;
  226. }
  227. }
  228. if(aFile)
  229. {
  230. fclose(aFile);
  231. aFile = NULL;
  232. }
  233. return aReturnLength > 0 ? aReturnLength - 1 : 0;
  234. }
  235. }
  236. break;
  237. }
  238. }
  239. if(aFile)
  240. {
  241. fclose(aFile);
  242. }
  243. if(!aKeyFound) { // key wasn't found return default
  244. ++aLength; // room for NULL char
  245. aLength = theReturnBufferLength < aLength ?
  246. theReturnBufferLength : aLength;
  247. strncpy(theReturnBuffer, theDefault, aLength);
  248. theReturnBuffer[aLength - 1] = '';
  249. aReturnLength = aLength - 1;
  250. }
  251. return aReturnLength > 0 ? aReturnLength - 1 : 0;
  252. }
  253. DWORD
  254. WritePrivateProfileString(char *theSection, // section name
  255. char *theKey, // write key name
  256. char *theBuffer, // input buffer
  257. char *theIniFileName) // pathname of ini file to write
  258. {
  259. return 0;
  260. }
  261. /* Ok. What the hell's the default behaviour for a null input buffer, and null
  262.  * section name. For now if either are null I ignore the request, until
  263.  * I find out different.
  264. DWORD
  265. WritePrivateProfileString(char *theSection, // section name
  266. char *theKey, // write key name
  267. char *theBuffer, // input buffer
  268. char *theIniFileName) // pathname of ini file to write
  269. {
  270. char buf[MAXPATHLEN+1];
  271. char* ptr = 0;
  272. FILE* aFile = 0;
  273. size_t aLength;
  274. char aLine[2048];
  275. char *aValue;
  276. char *aString;
  277. size_t aLineLength;
  278. size_t aReturnLength = 0;
  279. BOOL aSectionFound = FALSE;
  280. BOOL keyFound = FALSE;
  281. int j = 0;
  282. // If this isn't correct processing we'll change it later 
  283. if(theSection == NULL || theKey == NULL || theBuffer == NULL || 
  284. theIniFileName == NULL) return 0;
  285. aLength = strlen(theBuffer);
  286. if(aLength == 0) return 0;
  287. j = strlen(theIniFileName) + 1;
  288. ptr = (char*)getpwuid(getuid()); // get user info
  289. if( ptr == NULL)
  290. {
  291. if( MAXPATHLEN < j )
  292. theIniFileName[MAXPATHLEN] = '';
  293. sprintf(buf,"%s",theIniFileName);
  294. }
  295. ptr = ((struct passwd*)ptr)->pw_dir; // get user home dir
  296. if( ptr == NULL || *ptr == '' )
  297. ptr = "/home";
  298. // This doesn't make it so we find an ini file but allows normal
  299. //  processing to continue further on down. The likelihood is that
  300. // the file won't be found and thus the default value will be
  301. // returned.
  302. //
  303. if( MAXPATHLEN < strlen(ptr) + j )
  304. {
  305. if( MAXPATHLEN < strlen(ptr) )
  306. ptr[MAXPATHLEN] = '';
  307. else
  308. theIniFileName[MAXPATHLEN-strlen(ptr)] = '';
  309. }
  310. sprintf( buf, "%s/%s",ptr,theIniFileName );
  311.   // This code makes it so that a file in the users home dir
  312.   //  overrides a the "default" file as passed in
  313.   //
  314. aFile = (FILE*)(buf ? fopen(buf, "r+") : NULL);
  315. if(!aFile) {
  316. sprintf(buf,"%s",theIniFileName);
  317. aFile = (FILE*)(buf ? fopen(buf, "r+") : NULL);
  318. if(!aFile) return 0;
  319. }
  320. aLength = strlen(theBuffer);
  321. // We have to search for theKey, because if it already
  322. // exists we have to overwrite it. If it doesn't exist
  323. // we just write a new line to the file.
  324. //
  325. while(fgets(aLine, sizeof(aLine), aFile) != NULL)
  326. {
  327. aLineLength = strlen(aLine);
  328. // strip final 'n'
  329. if(aLineLength > 0 && aLine[aLineLength - 1] == 'n')
  330. {
  331. aLine[aLineLength - 1] = '';
  332. }
  333. switch(*aLine)
  334. {
  335. case ' ': // blank line
  336. case ';': // comment line
  337. continue;
  338. break;
  339. case '[': // section marker
  340. if( (aString = strchr(aLine, ']')) )
  341. {
  342. *aString = '';
  343. // accept as matched if key exact match
  344. if(!strcmp(aLine + 1, theSection))
  345. {
  346. aSectionFound = TRUE;
  347. }
  348. }
  349. break;
  350. default:
  351. // try to match value keys if in proper section
  352. if(aSectionFound)
  353. {
  354. // try to match requested key
  355. if( (aString = aValue = strchr(aLine, '=')) )
  356. {
  357. *aValue = '';
  358. ++aValue;
  359. // strip leading blanks in value field
  360. while(*aValue == ' ' && aValue < aLine + sizeof(aLine))
  361. {
  362. *aValue++ = '';
  363. }
  364. if(aValue >= aLine + sizeof(aLine))
  365. {
  366. aValue = "";
  367. }
  368. }
  369. else
  370. {
  371. aValue = "";
  372. }
  373. // strip trailing blanks from key
  374. if(aString)
  375. {
  376. while(--aString >= aLine && *aString == ' ')
  377. {
  378. *aString = '';
  379. }
  380. }
  381. // see if key is matched
  382. if(!strcmp(theKey, aLine))
  383. {
  384. keyFound = TRUE;
  385. // matched -- first, terminate value part
  386. // overwrite current value
  387. fseek(aFile,-aLineLength,SEEK_CUR);
  388. // overwrite key and value
  389. sprintf(aLine,"%s = %sn",theKey,theBuffer);
  390. fputs(aLine,aFile);
  391. }
  392. }
  393. }
  394. break;
  395. }
  396. }
  397. if(!keyFound) { // theKey wasn't in file so 
  398. if(aFile)
  399. {
  400. fclose(aFile);
  401. }
  402. return aReturnLength > 0 ? aReturnLength - 1 : 0;
  403. }
  404. */
  405. #endif