18ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
28ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * $Id: dict.c,v 1.1 2004/11/14 07:26:26 paulus Exp $
38ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
48ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (C) 2002 Roaring Penguin Software Inc.
58ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
68ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright (C) 1995,1996,1997 Lars Fenneberg
78ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
88ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright 1992 Livingston Enterprises, Inc.
98ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Copyright 1992,1993, 1994,1995 The Regents of the University of Michigan
118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * and Merit Network, Inc. All Rights Reserved
128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * See the file COPYRIGHT for the respective terms and conditions.
148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * If the file is missing contact me at lf@elemental.net
158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * and I'll send you a copy.
168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <includes.h>
208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project#include <radiusclient.h>
218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic DICT_ATTR *dictionary_attributes = NULL;
238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic DICT_VALUE *dictionary_values = NULL;
248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectstatic VENDOR_DICT *vendor_dictionaries = NULL;
258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_read_dictionary
288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Initialize the dictionary.  Read all ATTRIBUTES into
308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    the dictionary_attributes list.  Read all VALUES into
318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    the dictionary_values list.  Construct VENDOR dictionaries
328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *          as required.
338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Projectint rc_read_dictionary (char *filename)
378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	FILE           *dictfd;
398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char            dummystr[AUTH_ID_LEN];
408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char            namestr[AUTH_ID_LEN];
418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char            valstr[AUTH_ID_LEN];
428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char            attrstr[AUTH_ID_LEN];
438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char            typestr[AUTH_ID_LEN];
448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char            vendorstr[AUTH_ID_LEN];
458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int             line_no;
468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	DICT_ATTR      *attr;
478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	DICT_VALUE     *dval;
488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VENDOR_DICT    *vdict;
498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	char            buffer[256];
508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int             value;
518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int             type;
528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int             n;
538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	int             retcode;
548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if ((dictfd = fopen (filename, "r")) == (FILE *) NULL)
558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		error( "rc_read_dictionary: couldn't open dictionary %s: %s",
578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				filename, strerror(errno));
588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return (-1);
598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	line_no = 0;
628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	retcode = 0;
638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while (fgets (buffer, sizeof (buffer), dictfd) != (char *) NULL)
648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		line_no++;
668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		/* Skip empty space */
688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (*buffer == '#' || *buffer == '\0' || *buffer == '\n')
698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			continue;
718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (strncmp (buffer, "VENDOR", 6) == 0) {
748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    /* Read the VENDOR line */
758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    if (sscanf(buffer, "%s%s%d", dummystr, namestr, &value) != 3) {
768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			error("rc_read_dictionary: invalid vendor on line %d of dictionary %s",
778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			      line_no, filename);
788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			retcode = -1;
798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			break;
808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    }
818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    /* Validate entry */
828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    if (strlen (namestr) > NAME_LENGTH) {
838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			error("rc_read_dictionary: invalid name length on line %d of dictionary %s",
848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			      line_no, filename);
858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			retcode = -1;
868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			break;
878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    }
888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    /* Create new vendor entry */
898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    vdict = (VENDOR_DICT *) malloc (sizeof (VENDOR_DICT));
908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    if (!vdict) {
918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			novm("rc_read_dictionary");
928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			retcode = -1;
938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			break;
948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    }
958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    strcpy(vdict->vendorname, namestr);
968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    vdict->vendorcode = value;
978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    vdict->attributes = NULL;
988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    vdict->next = vendor_dictionaries;
998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    vendor_dictionaries = vdict;
1008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
1018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		else if (strncmp (buffer, "ATTRIBUTE", 9) == 0)
1028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
1038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			/* Read the ATTRIBUTE line.  It is one of:
1058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			 * ATTRIBUTE attr_name attr_val type         OR
1068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			 * ATTRIBUTE attr_name attr_val type vendor  */
1078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			vendorstr[0] = 0;
1088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			n = sscanf(buffer, "%s%s%s%s%s", dummystr, namestr, valstr, typestr, vendorstr);
1098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (n != 4 && n != 5)
1108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
1118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				error("rc_read_dictionary: invalid attribute on line %d of dictionary %s",
1128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				      line_no, filename);
1138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				retcode = -1;
1148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
1158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
1168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			/*
1188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			 * Validate all entries
1198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			 */
1208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (strlen (namestr) > NAME_LENGTH)
1218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
1228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				error("rc_read_dictionary: invalid name length on line %d of dictionary %s",
1238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				      line_no, filename);
1248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				retcode = -1;
1258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
1268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
1278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (strlen (vendorstr) > NAME_LENGTH)
1298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
1308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				error("rc_read_dictionary: invalid name length on line %d of dictionary %s",
1318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				      line_no, filename);
1328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				retcode = -1;
1338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
1348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
1358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (!isdigit (*valstr))
1378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
1388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				error("rc_read_dictionary: invalid value on line %d of dictionary %s",
1398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				      line_no, filename);
1408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				retcode = -1;
1418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
1428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
1438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			value = atoi (valstr);
1448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (strcmp (typestr, "string") == 0)
1468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
1478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				type = PW_TYPE_STRING;
1488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
1498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			else if (strcmp (typestr, "integer") == 0)
1508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
1518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				type = PW_TYPE_INTEGER;
1528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
1538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			else if (strcmp (typestr, "ipaddr") == 0)
1548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
1558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				type = PW_TYPE_IPADDR;
1568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
1578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			else if (strcmp (typestr, "date") == 0)
1588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
1598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				type = PW_TYPE_DATE;
1608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
1618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			else
1628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
1638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				error("rc_read_dictionary: invalid type on line %d of dictionary %s",
1648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				      line_no, filename);
1658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				retcode = -1;
1668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
1678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
1688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			/* Search for vendor if supplied */
1708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (*vendorstr) {
1718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    vdict = rc_dict_findvendor(vendorstr);
1728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    if (!vdict) {
1738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				    error("rc_read_dictionary: unknown vendor on line %d of dictionary %s",
1748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project					  line_no, filename);
1758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				    retcode = -1;
1768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				    break;
1778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    }
1788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			} else {
1798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    vdict = NULL;
1808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
1818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			/* Create a new attribute for the list */
1828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if ((attr =
1838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				(DICT_ATTR *) malloc (sizeof (DICT_ATTR)))
1848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project							== (DICT_ATTR *) NULL)
1858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
1868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				novm("rc_read_dictionary");
1878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				retcode = -1;
1888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
1898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
1908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			strcpy (attr->name, namestr);
1918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (vdict) {
1928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    attr->vendorcode = vdict->vendorcode;
1938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			} else {
1948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    attr->vendorcode = VENDOR_NONE;
1958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
1968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			attr->value = value;
1978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			attr->type = type;
1988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
1998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			/* Insert it into the list */
2008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (vdict) {
2018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    attr->next = vdict->attributes;
2028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    vdict->attributes = attr;
2038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			} else {
2048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    attr->next = dictionary_attributes;
2058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			    dictionary_attributes = attr;
2068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
2078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
2088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		else if (strncmp (buffer, "VALUE", 5) == 0)
2098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
2108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			/* Read the VALUE line */
2118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (sscanf (buffer, "%s%s%s%s", dummystr, attrstr,
2128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				    namestr, valstr) != 4)
2138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
2148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				error("rc_read_dictionary: invalid value entry on line %d of dictionary %s",
2158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				      line_no, filename);
2168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				retcode = -1;
2178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
2188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
2198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			/*
2218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			 * Validate all entries
2228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			 */
2238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (strlen (attrstr) > NAME_LENGTH)
2248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
2258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				error("rc_read_dictionary: invalid attribute length on line %d of dictionary %s",
2268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				      line_no, filename);
2278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				retcode = -1;
2288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
2298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
2308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (strlen (namestr) > NAME_LENGTH)
2328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
2338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				error("rc_read_dictionary: invalid name length on line %d of dictionary %s",
2348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				      line_no, filename);
2358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				retcode = -1;
2368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
2378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
2388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (!isdigit (*valstr))
2408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
2418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				error("rc_read_dictionary: invalid value on line %d of dictionary %s",
2428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				      line_no, filename);
2438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				retcode = -1;
2448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
2458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
2468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			value = atoi (valstr);
2478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			/* Create a new VALUE entry for the list */
2498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if ((dval =
2508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				(DICT_VALUE *) malloc (sizeof (DICT_VALUE)))
2518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project							== (DICT_VALUE *) NULL)
2528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
2538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				novm("rc_read_dictionary");
2548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				retcode = -1;
2558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
2568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
2578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			strcpy (dval->attrname, attrstr);
2588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			strcpy (dval->name, namestr);
2598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			dval->value = value;
2608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			/* Insert it into the list */
2628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			dval->next = dictionary_values;
2638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			dictionary_values = dval;
2648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
2658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		else if (strncmp (buffer, "INCLUDE", 7) == 0)
2668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
2678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			/* Read the INCLUDE line */
2688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (sscanf (buffer, "%s%s", dummystr, namestr) != 2)
2698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
2708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				error("rc_read_dictionary: invalid include entry on line %d of dictionary %s",
2718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				      line_no, filename);
2728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				retcode = -1;
2738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
2748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
2758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			if (rc_read_dictionary(namestr) == -1)
2768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			{
2778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				retcode = -1;
2788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				break;
2798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			}
2808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
2818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
2828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	fclose (dictfd);
2838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return retcode;
2848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
2858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
2878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_dict_getattr
2888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Return the full attribute structure based on the
2908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    attribute id number and vendor code.  If vendor code is VENDOR_NONE,
2918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *          non-vendor-specific attributes are used
2928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
2938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
2948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
2958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectDICT_ATTR *rc_dict_getattr (int attribute, int vendor)
2968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
2978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	DICT_ATTR      *attr;
2988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VENDOR_DICT    *dict;
2998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (vendor == VENDOR_NONE) {
3018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    attr = dictionary_attributes;
3028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    while (attr != (DICT_ATTR *) NULL) {
3038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (attr->value == attribute) {
3048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    return (attr);
3058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
3068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		attr = attr->next;
3078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
3088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	} else {
3098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    dict = rc_dict_getvendor(vendor);
3108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    if (!dict) {
3118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		return NULL;
3128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
3138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    attr = dict->attributes;
3148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    while (attr) {
3158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (attr->value == attribute) {
3168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    return attr;
3178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
3188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		attr = attr->next;
3198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
3208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
3218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return NULL;
3228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
3258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_dict_findattr
3268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Return the full attribute structure based on the
3288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *	    attribute name.
3298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
3318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectDICT_ATTR *rc_dict_findattr (char *attrname)
3338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
3348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	DICT_ATTR      *attr;
3358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	VENDOR_DICT    *dict;
3368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	attr = dictionary_attributes;
3388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while (attr != (DICT_ATTR *) NULL)
3398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
3408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (strcasecmp (attr->name, attrname) == 0)
3418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
3428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			return (attr);
3438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
3448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		attr = attr->next;
3458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
3468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	/* Search vendor-specific dictionaries */
3488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	dict = vendor_dictionaries;
3498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while (dict) {
3508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    attr = dict->attributes;
3518ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    while (attr) {
3528ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (strcasecmp (attr->name, attrname) == 0) {
3538ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		    return (attr);
3548ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
3558ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		attr = attr->next;
3568ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    }
3578ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    dict = dict->next;
3588ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
3598ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return ((DICT_ATTR *) NULL);
3608ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3618ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3628ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3638ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
3648ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_dict_findval
3658ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3668ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Return the full value structure based on the
3678ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *         value name.
3688ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3698ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
3708ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3718ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectDICT_VALUE *rc_dict_findval (char *valname)
3728ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
3738ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	DICT_VALUE     *val;
3748ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3758ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	val = dictionary_values;
3768ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while (val != (DICT_VALUE *) NULL)
3778ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
3788ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (strcasecmp (val->name, valname) == 0)
3798ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
3808ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			return (val);
3818ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
3828ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		val = val->next;
3838ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
3848ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return ((DICT_VALUE *) NULL);
3858ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
3868ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3878ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
3888ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: dict_getval
3898ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3908ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Return the full value structure based on the
3918ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *          actual value and the associated attribute name.
3928ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
3938ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
3948ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3958ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectDICT_VALUE * rc_dict_getval (UINT4 value, char *attrname)
3968ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
3978ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	DICT_VALUE     *val;
3988ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
3998ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	val = dictionary_values;
4008ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	while (val != (DICT_VALUE *) NULL)
4018ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	{
4028ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		if (strcmp (val->attrname, attrname) == 0 &&
4038ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project				val->value == value)
4048ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		{
4058ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project			return (val);
4068ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		}
4078ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project		val = val->next;
4088ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
4098ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	return ((DICT_VALUE *) NULL);
4108ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
4118ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4128ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
4138ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_dict_findvendor
4148ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
4158ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Return the vendor's dictionary given the vendor name.
4168ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
4178ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
4188ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectVENDOR_DICT * rc_dict_findvendor (char *vendorname)
4198ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
4208ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    VENDOR_DICT *dict;
4218ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4228ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    dict = vendor_dictionaries;
4238ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    while (dict) {
4248ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (!strcmp(vendorname, dict->vendorname)) {
4258ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    return dict;
4268ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
4278ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	dict = dict->next;
4288ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
4298ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return NULL;
4308ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
4318ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4328ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project/*
4338ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Function: rc_dict_getvendor
4348ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
4358ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project * Purpose: Return the vendor's dictionary given the vendor ID
4368ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project *
4378ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project */
4388ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source ProjectVENDOR_DICT * rc_dict_getvendor (int id)
4398ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project{
4408ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    VENDOR_DICT *dict;
4418ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project
4428ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    dict = vendor_dictionaries;
4438ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    while (dict) {
4448ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	if (id == dict->vendorcode) {
4458ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	    return dict;
4468ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	}
4478ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project	dict = dict->next;
4488ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    }
4498ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project    return NULL;
4508ad0dd2a5c5f23cd210aedba72a43e48026e7436The Android Open Source Project}
451