Home | History | Annotate | Download | only in Locale
      1 /* $NetBSD: aliasname.c,v 1.2 2005/02/09 21:35:46 kleink Exp $ */
      2 
      3 /*-
      4  * Copyright (c)2002 YAMAMOTO Takashi,
      5  * All rights reserved.
      6  *
      7  * Redistribution and use in source and binary forms, with or without
      8  * modification, are permitted provided that the following conditions
      9  * are met:
     10  * 1. Redistributions of source code must retain the above copyright
     11  *    notice, this list of conditions and the following disclaimer.
     12  * 2. Redistributions in binary form must reproduce the above copyright
     13  *    notice, this list of conditions and the following disclaimer in the
     14  *    documentation and/or other materials provided with the distribution.
     15  *
     16  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
     17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     18  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     19  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
     20  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     21  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     22  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     23  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     24  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     25  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     26  * SUCH DAMAGE.
     27  */
     28 #include  <LibConfig.h>
     29 #include  <sys/EfiCdefs.h>
     30 #if defined(LIBC_SCCS) && !defined(lint)
     31 __RCSID("$NetBSD: aliasname.c,v 1.2 2005/02/09 21:35:46 kleink Exp $");
     32 #endif /* LIBC_SCCS and not lint */
     33 
     34 #include "namespace.h"
     35 #include <assert.h>
     36 #include <stdio.h>
     37 #include <string.h>
     38 
     39 #include "aliasname_local.h"
     40 
     41 __inline int __is_ws(char);
     42 
     43 __inline int __is_ws(char ch)
     44 {
     45 
     46   return (ch == ' ' || ch == '\t');
     47 }
     48 
     49 const char *
     50 __unaliasname(const char *dbname, const char *alias, void *buf, size_t bufsize)
     51 {
     52   FILE *fp = NULL;
     53   const char *result = alias;
     54   size_t resultlen;
     55   size_t aliaslen;
     56   const char *p;
     57   size_t len;
     58 
     59   _DIAGASSERT(dbname != NULL);
     60   _DIAGASSERT(alias != NULL);
     61   _DIAGASSERT(buf != NULL);
     62 
     63   fp = fopen(dbname, "r");
     64   if (fp == NULL)
     65     goto quit;
     66 
     67   aliaslen = strlen(alias);
     68 
     69   while (/*CONSTCOND*/ 1) {
     70     p = fgetln(fp, &len);
     71     if (p == NULL)
     72       goto quit; /* eof or error */
     73 
     74     _DIAGASSERT(len != 0);
     75 
     76     /* ignore terminating NL */
     77     if (p[len - 1] == '\n')
     78       len--;
     79 
     80     /* ignore null line and comment */
     81     if (len == 0 || p[0] == '#')
     82       continue;
     83 
     84     if (aliaslen > len)
     85       continue;
     86 
     87     if (memcmp(alias, p, aliaslen))
     88       continue;
     89 
     90     p += aliaslen;
     91     len -= aliaslen;
     92 
     93     if (len == 0 || !__is_ws(*p))
     94       continue;
     95 
     96     /* entry was found here */
     97     break;
     98 
     99     /* NOTREACHED */
    100   }
    101 
    102   /* skip white spaces */
    103   do {
    104     p++;
    105     len--;
    106   } while (len != 0 && __is_ws(*p));
    107 
    108   if (len == 0)
    109     goto quit;
    110 
    111   /* count length of result */
    112   resultlen = 0;
    113   while (resultlen < len && !__is_ws(*p))
    114     resultlen++;
    115 
    116   /* check if space is enough */
    117   if (bufsize < resultlen + 1)
    118     goto quit;
    119 
    120   memcpy(buf, p, resultlen);
    121   ((char *)buf)[resultlen] = 0;
    122   result = buf;
    123 
    124 quit:
    125   if (fp)
    126     fclose(fp);
    127 
    128   return result;
    129 }
    130