18b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project/* Copyright (C) 2007-2008 The Android Open Source Project
28b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project**
38b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This software is licensed under the terms of the GNU General Public
48b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** License version 2, as published by the Free Software Foundation, and
58b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** may be copied, distributed, and modified under those terms.
68b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project**
78b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** This program is distributed in the hope that it will be useful,
88b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** but WITHOUT ANY WARRANTY; without even the implied warranty of
98b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project** GNU General Public License for more details.
118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project*/
128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <string.h>
138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <ctype.h>
148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <stdlib.h>
158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <fcntl.h>
168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include <unistd.h>
174e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner#include <errno.h>
188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/config.h"
208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#include "android/utils/path.h"
218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectAConfig*
238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectaconfig_node(const char *name, const char *value)
248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AConfig *n;
268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    n = (AConfig*) calloc(sizeof(AConfig), 1);
288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    n->name = name ? name : "";
298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    n->value = value ? value : "";
308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return n;
328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic AConfig*
358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project_aconfig_find(AConfig *root, const char *name, int create)
368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AConfig *node;
388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(node = root->first_child; node; node = node->next) {
408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if(!strcmp(node->name, name)) return node;
418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if(create) {
448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        node = (AConfig*) calloc(sizeof(AConfig), 1);
458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        node->name = name;
468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        node->value = "";
478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if(root->last_child) {
498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            root->last_child->next = node;
508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        } else {
518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            root->first_child = node;
528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        root->last_child = node;
548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return node;
578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source ProjectAConfig*
608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectaconfig_find(AConfig *root, const char *name)
618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return _aconfig_find(root, name, 0);
638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint
668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectaconfig_bool(AConfig *root, const char *name, int _default)
678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AConfig *n = _aconfig_find(root, name, 0);
698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if(n == 0) {
708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return _default;
718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else {
728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        switch(n->value[0]){
738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case 'y':
748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case 'Y':
758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case '1':
768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return 1;
778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        default:
788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return 0;
798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectunsigned
848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectaconfig_unsigned(AConfig *root, const char *name, unsigned _default)
858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AConfig *n = _aconfig_find(root, name, 0);
878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if(n == 0) {
888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return _default;
898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else {
908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return strtoul(n->value, 0, 0);
918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint
958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectaconfig_int(AConfig *root, const char *name, int _default)
968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AConfig *n = _aconfig_find(root, name, 0);
988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if(n == 0) {
998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return _default;
1008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else {
1018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return strtol(n->value, 0, 0);
1028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectconst char*
1078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectaconfig_str(AConfig *root, const char *name, const char *_default)
1088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AConfig *n = _aconfig_find(root, name, 0);
1108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if(n == 0) {
1118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return _default;
1128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    } else {
1138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return n->value;
1148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
1188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectaconfig_set(AConfig *root, const char *name, const char *value)
1198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AConfig *node = _aconfig_find(root, name, 1);
1218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    node->value = value;
1228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
1238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define T_EOF 0
1258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define T_TEXT 1
1268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define T_DOT 2
1278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define T_OBRACE 3
1288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define T_CBRACE 4
1298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct
1318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char *data;
1338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char *text;
1348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int len;
1358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char next;
1368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} cstate;
1378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int _lex(cstate *cs, int value)
1408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
1418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char c;
1428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char *s;
1438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char *data;
1448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    data = cs->data;
1468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if(cs->next != 0) {
1488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        c = cs->next;
1498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        cs->next = 0;
1508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        goto got_c;
1518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
1528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectrestart:
1548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(;;) {
1558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        c = *data++;
1568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    got_c:
1578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if(isspace(c)) continue;
1588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        switch(c) {
1608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case 0:
1618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return T_EOF;
1628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* a sharp sign (#) starts a line comment and everything
1648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         * behind that is ignored until the end of line
1658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project         */
1668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case '#':
1678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            for(;;) {
1688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                switch(*data) {
1698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case 0:
1708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    cs->data = data;
1718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    return T_EOF;
1728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                case '\n':
1738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    cs->data = data + 1;
1748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    goto restart;
1758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                default:
1768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    data++;
1778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
1788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
1798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            break;
1808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case '.':
1828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            cs->data = data;
1838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return T_DOT;
1848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case '{':
1868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            cs->data = data;
1878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return T_OBRACE;
1888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case '}':
1908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            cs->data = data;
1918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return T_CBRACE;
1928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        default:
1948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            s = data - 1;
1958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
1968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if(value) {
1974e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner               /* if we're looking for a value, then take anything
1988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                * until the end of line. note that sharp signs do
1998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                * not start comments then. the result will be stripped
2008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                * from trailing whitespace.
2018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                */
2028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                for(;;) {
2038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if(*data == 0) {
2048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        cs->data = data;
2058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        break;
2068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
2078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if(*data == '\n') {
2088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        cs->data = data + 1;
2098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        *data-- = 0;
2108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        break;
2118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
2128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    data++;
2138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
2148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    /* strip trailing whitespace */
2168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                while(data > s){
2178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if(!isspace(*data)) break;
2188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    *data-- = 0;
2198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
2208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                goto got_text;
2228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            } else {
2238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project               /* looking for a key name. we stop at whitspace,
2248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                * EOF, of T_DOT/T_OBRACE/T_CBRACE characters.
2258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                * note that the name can include sharp signs
2268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                */
2278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                for(;;) {
2288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    if(isspace(*data)) {
2298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        *data = 0;
2308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        cs->data = data + 1;
2318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        goto got_text;
2328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
2338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    switch(*data) {
2348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    case 0:
2358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        cs->data = data;
2368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        goto got_text;
2378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    case '.':
2388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    case '{':
2398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    case '}':
2408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        cs->next = *data;
2418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        *data = 0;
2428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        cs->data = data + 1;
2438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        goto got_text;
2448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    default:
2458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                        data++;
2468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                    }
2478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                }
2488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
2498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
2508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectgot_text:
2538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    cs->text = s;
2548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return T_TEXT;
2558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#if 0
2588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectchar *TOKENNAMES[] = { "EOF", "TEXT", "DOT", "OBRACE", "CBRACE" };
2598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int lex(cstate *cs, int value)
2618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int tok = _lex(cs, value);
2638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    printf("TOKEN(%d) %s %s\n", value, TOKENNAMES[tok],
2648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project           tok == T_TEXT ? cs->text : "");
2658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return tok;
2668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#else
2688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#define lex(cs,v) _lex(cs,v)
2698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
2708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int parse_expr(cstate *cs, AConfig *node);
2728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int
2748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectparse_block(cstate *cs, AConfig *node)
2758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(;;){
2778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        switch(lex(cs, 0)){
2788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case T_TEXT:
2798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if(parse_expr(cs, node)) return -1;
2808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            continue;
2818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case T_CBRACE:
2838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return 0;
2848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        default:
2868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return -1;
2878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
2888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
2898b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
2908b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2918b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int
2928b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectparse_expr(cstate *cs, AConfig *node)
2938b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
2948b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        /* last token was T_TEXT */
2958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    node = _aconfig_find(node, cs->text, 1);
2968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
2978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for(;;) {
2988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        switch(lex(cs, 1)) {
2998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case T_DOT:
3008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            if(lex(cs, 0) != T_TEXT) return -1;
3018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            node = _aconfig_find(node, cs->text, 1);
3028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            continue;
3038b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3048b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case T_TEXT:
3058b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            node->value = cs->text;
3068b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return 0;
3078b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3088b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        case T_OBRACE:
3098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return parse_block(cs, node);
3108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        default:
3128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            return -1;
3138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
3148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectvoid
3188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectaconfig_load(AConfig *root, char *data)
3198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if(data != 0) {
3218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        cstate cs;
3228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        cs.data = data;
3238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        cs.next = 0;
3248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        for(;;) {
3268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            switch(lex(&cs, 0)){
3278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            case T_TEXT:
3288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                if(parse_expr(&cs, root)) return;
3298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                break;
3308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            default:
3318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project                return;
3328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            }
3338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
3348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint
3388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectaconfig_load_file(AConfig *root, const char *fn)
3398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char *data;
3418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    data = path_load_file(fn, NULL);
3428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (data == NULL)
3438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
3448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    aconfig_load(root, data);
3468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
3478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projecttypedef struct
3518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char   buff[1024];
3538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char*  p;
3548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    char*  end;
3558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    int    fd;
3568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project} Writer;
3578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic int
3598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectwriter_init( Writer*  w, const char*  fn )
3608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    w->p   = w->buff;
3628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    w->end = w->buff + sizeof(w->buff);
3638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    w->fd  = creat( fn, 0755 );
3658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (w->fd < 0)
3668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
3678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#ifdef _WIN32
3698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    _setmode( w->fd, _O_BINARY );
3708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project#endif
3718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
3728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
3758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectwriter_write( Writer*  w, const char*  src, int  len )
3768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
3778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    while (len > 0) {
3788b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        int  avail = w->end - w->p;
3798b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3808b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (avail > len)
3818b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            avail = len;
3828b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3838b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        memcpy( w->p, src, avail );
3848b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        src += avail;
3858b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        len -= avail;
3868b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
3878b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        w->p += avail;
3888b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        if (w->p == w->end) {
3894e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner            int ret;
3904e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner            do {
3914e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner                ret = write( w->fd, w->buff, w->p - w->buff );
3924e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner            } while (ret < 0 && errno == EINTR);
3934e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner            if (ret < 0)
3944e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner                break;
3958b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            w->p = w->buff;
3968b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        }
3978b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
3988b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
3998b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4008b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
4018b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectwriter_done( Writer*  w )
4028b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4034e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner    if (w->p > w->buff) {
4044e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner        int ret;
4054e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner        do {
4064e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner            ret = write( w->fd, w->buff, w->p - w->buff );
4074e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner        } while (ret < 0 && errno == EINTR);
4084e024bb4f5c8aa8b07459f7fbd65c35122127fd1David 'Digit' Turner    }
4098b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    close( w->fd );
4108b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4118b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4128b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
4138b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectwriter_margin( Writer*  w, int  margin)
4148b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4158b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    static const char  spaces[10] = "          ";
4168b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    while (margin >= 10) {
4178b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        writer_write(w,spaces,10);
4188b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        margin -= 10;
4198b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4208b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (margin > 0)
4218b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        writer_write(w,spaces,margin);
4228b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4238b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4248b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
4258b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectwriter_c(Writer*  w, char  c)
4268b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4278b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    writer_write(w, &c, 1);
4288b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4298b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4308b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
4318b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectwriter_str(Writer*  w, const char*  str)
4328b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4338b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    writer_write(w, str, strlen(str));
4348b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4358b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4368b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectstatic void
4378b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectwriter_node(Writer*  w, AConfig*  node, int  margin)
4388b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4398b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    writer_margin(w,margin);
4408b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    writer_str(w, node->name);
4418b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    writer_c(w,' ');
4428b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4438b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (node->value[0]) {
4448b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        writer_str(w, node->value);
4458b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        writer_c(w,'\n');
4468b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4478b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    else
4488b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    {
4498b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        AConfig*  child;
4508b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4518b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        writer_c(w, '{');
4528b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        writer_c(w, '\n');
4538b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4548b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        for (child = node->first_child; child; child = child->next)
4558b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project            writer_node(w,child,margin+4);
4568b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4578b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        writer_margin(w,margin);
4588b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        writer_c(w,'}');
4598b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        writer_c(w,'\n');
4608b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    }
4618b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
4628b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4638b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectint
4648b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Projectaconfig_save_file(AConfig *root, const char *fn)
4658b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project{
4668b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    AConfig*  child;
4678b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    Writer    w[1];
4688b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4698b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    if (writer_init(w,fn) < 0)
4708b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        return -1;
4718b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4728b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    for (child = root->first_child; child; child = child->next)
4738b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project        writer_node(w,child,0);
4748b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project
4758b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    writer_done(w);
4768b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project    return 0;
4778b23a6c7e1aee255004dd19098d4c2462b61b849The Android Open Source Project}
478