locale.c
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:4k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: locale.c,v $
  4.  * PRODUCTION Revision 1000.0  2003/10/29 20:34:51  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [ORIGINAL] Dev-tree R1.1
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /* FreeTDS - Library of routines accessing Sybase and Microsoft databases
  10.  * Copyright (C) 1998-1999  Brian Bruns
  11.  *
  12.  * This library is free software; you can redistribute it and/or
  13.  * modify it under the terms of the GNU Library General Public
  14.  * License as published by the Free Software Foundation; either
  15.  * version 2 of the License, or (at your option) any later version.
  16.  *
  17.  * This library is distributed in the hope that it will be useful,
  18.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  19.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  20.  * Library General Public License for more details.
  21.  *
  22.  * You should have received a copy of the GNU Library General Public
  23.  * License along with this library; if not, write to the
  24.  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  25.  * Boston, MA 02111-1307, USA.
  26.  */
  27. #include <tds_config.h>
  28. #include <stdio.h>
  29. #include <stdlib.h>
  30. #include <stdarg.h>
  31. #include <time.h>
  32. #include <limits.h>
  33. #include <assert.h>
  34. #include <ctype.h>
  35. #ifdef __DGUX__
  36. #include <paths.h>
  37. #endif
  38. #ifdef __FreeBSD__
  39. #include <sys/time.h>
  40. #endif
  41. #ifdef WIN32
  42. #include <windows.h>
  43. #include <stdio.h>
  44. #define PATH_MAX 255
  45. #endif
  46. #ifndef WIN32
  47. #include <netdb.h>
  48. #include <sys/types.h>
  49. #include <netinet/in.h>
  50. #include <arpa/inet.h>
  51. #endif
  52. #include "tds.h"
  53. #include "tdsutil.h"
  54. #ifdef DMALLOC
  55. #include <dmalloc.h>
  56. #endif
  57. static char  software_version[]   = "$Id: locale.c,v 1000.0 2003/10/29 20:34:51 gouriano Exp $";
  58. static void *no_unused_var_warn[] = {software_version,
  59.                                      no_unused_var_warn};
  60. static int tds_read_locale_section(FILE *in, char *section, TDSLOCINFO *config);
  61. TDSLOCINFO *tds_get_locale()
  62. {
  63. TDSLOCINFO *locale;
  64. char *s;
  65. int i;
  66. FILE *in;
  67. /* allocate a new structure with hard coded and build-time defaults */
  68. locale = tds_alloc_locale();
  69. tdsdump_log(TDS_DBG_INFO1, "%L Attempting to read locales.conf filen");
  70. in = fopen(FREETDS_LOCALECONFFILE, "r");
  71. if (in) {
  72. tds_read_locale_section(in, "default", locale);
  73. s = getenv("LANG");
  74. if (s && strlen(s)) {
  75. rewind(in);
  76. for (i=0;i<strlen(s);i++) s[i]=tolower(s[i]);
  77. tds_read_locale_section(in, s, locale);
  78. }
  79. fclose(in);
  80. }
  81. return locale;
  82. }
  83. static int tds_read_locale_section(FILE *in, char *section, TDSLOCINFO *locale)
  84. {
  85. char line[256], option[256], value[256], *s;
  86. int i;
  87. char p;
  88. int insection = 0;
  89. int found = 0;
  90. while (fgets(line, 256, in)) {
  91. s = line;
  92. /* skip leading whitespace */
  93. while (*s && isspace(*s)) s++;
  94. /* skip it if it's a comment line */
  95. if (*s==';' || *s=='#') continue;
  96. /* read up to the = ignoring duplicate spaces */
  97. p = 0; i = 0;
  98. while (*s && *s!='=') {
  99. if (!isspace(*s) && isspace(p)) 
  100. option[i++]=' ';
  101. if (!isspace(*s)) 
  102. option[i++]=tolower(*s);
  103. p = *s;
  104. s++;
  105. }
  106. option[i]='';
  107. /* skip the = */
  108. if(*s) s++;
  109. /* skip leading whitespace */
  110. while (*s && isspace(*s)) s++;
  111. /* read up to a # ; or null ignoring duplicate spaces */
  112. p = 0; i = 0;
  113. while (*s && *s!=';' && *s!='#') {
  114. if (!isspace(*s) && isspace(p)) 
  115. value[i++]=' ';
  116. if (!isspace(*s)) 
  117. value[i++]=*s;
  118. p = *s;
  119. s++;
  120. }
  121. value[i]='';
  122. if (!strlen(option)) 
  123. continue;
  124. if (option[0]=='[') {
  125. s = &option[1];
  126. while (*s) {
  127. if (*s==']') *s='';
  128. s++;
  129. }
  130. if (!strcmp(section, &option[1])) {
  131. tdsdump_log(TDS_DBG_INFO1, "%L Found matching sectionn");
  132. insection=1;
  133. found=1;
  134. } else {
  135. insection=0;
  136. }
  137. } else if (insection) {
  138. if (!strcmp(option,TDS_STR_CHARSET)) {
  139. if (locale->char_set) free(locale->char_set);
  140. locale->char_set = strdup(value);
  141. } else if (!strcmp(option,TDS_STR_LANGUAGE)) {
  142. if (locale->language) free(locale->language);
  143. locale->language = strdup(value);
  144. } else if (!strcmp(option,TDS_STR_DATEFMT)) {
  145. if (locale->date_fmt) free(locale->date_fmt);
  146. locale->date_fmt = strdup(value);
  147. }
  148. }
  149. }
  150. return found;
  151. }