Print this page
2964 need POSIX 2008 locale object support
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Gordon Ross <gordon.ross@nexenta.com>
Approved by: TBD

Split Close
Expand all
Collapse all
          --- old/usr/src/lib/libc/port/locale/ldpart.c
          +++ new/usr/src/lib/libc/port/locale/ldpart.c
   1    1  /*
        2 + * Copyright 2013 Garrett D'Amore <garrett@damore.org>
   2    3   * Copyright 2010 Nexenta Systems, Inc.  All rights reserved.
   3    4   * Copyright (c) 2000, 2001 Alexey Zelkin <phantom@FreeBSD.org>
   4    5   * All rights reserved.
   5    6   *
   6    7   * Redistribution and use in source and binary forms, with or without
   7    8   * modification, are permitted provided that the following conditions
   8    9   * are met:
   9   10   * 1. Redistributions of source code must retain the above copyright
  10   11   *    notice, this list of conditions and the following disclaimer.
  11   12   * 2. Redistributions in binary form must reproduce the above copyright
↓ open down ↓ 24 lines elided ↑ open up ↑
  36   37  #include <string.h>
  37   38  #include <unistd.h>
  38   39  #include <stdio.h>
  39   40  
  40   41  #include "ldpart.h"
  41   42  #include "setlocale.h"
  42   43  
  43   44  static int split_lines(char *, const char *);
  44   45  
  45   46  int
  46      -__part_load_locale(const char *name, int *using_locale,
       47 +__part_load_locale(const char *name,
  47   48      char **locale_buf, const char *category_filename,
  48   49      int locale_buf_size_max, int locale_buf_size_min,
  49   50      const char **dst_localebuf)
  50   51  {
  51   52          int             saverr, fd, i, num_lines;
  52   53          char            *lbuf, *p;
  53   54          const char      *plim;
  54   55          char            filename[PATH_MAX];
  55   56          struct stat     st;
  56   57          size_t          namesize, bufsize;
  57   58  
  58      -        /* 'name' must be already checked. */
  59      -        if (strcmp(name, "C") == 0 || strcmp(name, "POSIX") == 0) {
  60      -                *using_locale = 0;
  61      -                return (_LDP_CACHE);
  62      -        }
  63      -
  64   59          /*
  65      -         * If the locale name is the same as our cache, use the cache.
  66      -         */
  67      -        if (*locale_buf != NULL && strcmp(name, *locale_buf) == 0) {
  68      -                *using_locale = 1;
  69      -                return (_LDP_CACHE);
  70      -        }
  71      -
  72      -        /*
  73   60           * Slurp the locale file into the cache.
  74   61           */
  75   62          namesize = strlen(name) + 1;
  76   63  
  77   64          /* 'PathLocale' must be already set & checked. */
  78   65  
  79   66          (void) snprintf(filename, sizeof (filename), "%s/%s/%s/LCL_DATA",
  80   67              _PathLocale, name, category_filename);
  81   68  
  82   69          if ((fd = open(filename, O_RDONLY)) < 0)
↓ open down ↓ 27 lines elided ↑ open up ↑
 110   97          else if (num_lines >= locale_buf_size_min)
 111   98                  num_lines = locale_buf_size_min;
 112   99          else {
 113  100                  errno = EINVAL;
 114  101                  goto bad_lbuf;
 115  102          }
 116  103          (void) close(fd);
 117  104          /*
 118  105           * Record the successful parse in the cache.
 119  106           */
 120      -        if (*locale_buf != NULL)
 121      -                free(*locale_buf);
 122  107          *locale_buf = lbuf;
 123  108          for (p = *locale_buf, i = 0; i < num_lines; i++)
 124  109                  dst_localebuf[i] = (p += strlen(p) + 1);
 125  110          for (i = num_lines; i < locale_buf_size_max; i++)
 126  111                  dst_localebuf[i] = NULL;
 127      -        *using_locale = 1;
 128  112  
 129  113          return (_LDP_LOADED);
 130  114  
 131  115  bad_lbuf:
 132  116          saverr = errno;
 133  117          free(lbuf);
 134  118          errno = saverr;
 135  119  bad_locale:
 136  120          saverr = errno;
 137  121          (void) close(fd);
↓ open down ↓ 20 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX