Exemple #1
0
static void
tzcheck_reset(tzcheck_t *tzc)
{
	tzcheck_free_tze_avl(&tzc->tzc_zoneinfo_manifest);
	tzcheck_free_tze_avl(&tzc->tzc_zoneinfo_proto);

	free(tzc->tzc_manifest_path);
	free(tzc->tzc_proto_path);
	custr_free(tzc->tzc_prefix);

	bzero(tzc, sizeof (*tzc));
}
Exemple #2
0
int
split_on(const char *line, char delim, strlist_t *sl)
{
    custr_t *cu = NULL;
    int error = 0;
    const char *c = line;

    if (custr_alloc(&cu) != 0) {
        error = errno;
        goto out;
    }

    for (;;) {
        char cc = *c++;

        if (cc == '\0') {
            if (custr_len(cu) > 0 && strlist_set_tail(sl,
                    custr_cstr(cu)) != 0) {
                error = errno;
            }
            goto out;
        } else if (cc == delim) {
            if (strlist_set_tail(sl, custr_cstr(cu)) != 0) {
                error = errno;
                goto out;
            }
            custr_reset(cu);
        } else {
            if (custr_appendc(cu, cc) != 0) {
                error = errno;
                goto out;
            }
        }
    }

out:
    custr_free(cu);
    errno = error;
    return (error == 0 ? 0 : -1);
}
Exemple #3
0
int
parse_line(const char *line, strlist_t *sl)
{
    custr_t *cu = NULL;
    state_t state = ST_WHITESPACE;
    const char *c = line;
    int error = 0;

    if (custr_alloc(&cu) != 0) {
        error = errno;
        goto out;
    }

    for (;;) {
        char cc = *c;
        lextype_t lextype;

        /*
         * Determine which class of character this is:
         */
        switch (cc) {
        case '\0':
        case '#':
        case '\n':
        case '\r':
            lextype = LEX_ENDL;
            break;

        case ' ':
        case '\t':
            lextype = LEX_WHITESPACE;
            break;

        default:
            lextype = LEX_OTHER;
            break;
        }

        /*
         * Determine what to do with this character based on the class
         * and our current state:
         */
        switch (state) {
        case ST_WHITESPACE: {
            switch (lextype) {
            case LEX_ENDL:
                goto out;

            case LEX_WHITESPACE:
                c++;
                break;

            case LEX_OTHER:
                state = ST_TOKEN;
                break;

            default:
                (void) printf("ST_WHITESPACE: unknown "
                              "lextype: %d\n", lextype);
                abort();
            }
            break;
        }

        case ST_TOKEN: {
            switch (lextype) {
            case LEX_ENDL:
                if (strlist_set_tail(sl, custr_cstr(cu)) != 0) {
                    error = errno;
                    goto out;
                }
                goto out;

            case LEX_WHITESPACE:
                if (strlist_set_tail(sl, custr_cstr(cu)) != 0) {
                    error = errno;
                    goto out;
                }
                custr_reset(cu);
                state = ST_WHITESPACE;
                break;

            case LEX_OTHER:
                if (custr_appendc(cu, cc) != 0) {
                    error = errno;
                    goto out;
                }
                c++;
                break;

            default:
                (void) printf("ST_TOKEN: unknown lextype: %d\n",
                              lextype);
                abort();
            }
            break;
        }

        default:
            (void) printf("unknown state: %d\n", state);
            abort();
        }
    }

out:
    custr_free(cu);
    errno = error;
    return (error == 0 ? 0 : -1);
}