;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2020 Ludovic Courtès ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . ;;; ;;; Validate 'etc/news.scm'. ;;; (use-modules (git) (guix git) (guix ui) (guix channels) (srfi srfi-26) (ice-9 match)) ;; XXX: These two things are currently private. (define read-channel-news (@@ (guix channels) read-channel-news)) (define channel-news-entries (cut struct-ref <> 0)) (define (all-the-news directory) "Return the read from DIRECTORY, a checkout of the 'guix' channel." (call-with-input-file (string-append directory "/etc/news.scm") read-channel-news)) (define (validate-texinfo str type language) "Parse STR as a Texinfo fragment and raise an error if that fails." (catch #t (lambda () (texi->plain-text str)) (lambda (key . args) (print-exception (current-error-port) #f key args) (report-error (G_ "the Texinfo snippet below is invalid (~a, ~a):~%") type language) (display str (current-error-port)) (exit 1)))) (define (validate-news-entry repository entry) "Validate ENTRY, a , making sure it refers to an existent commit of REPOSITORY and contains only valid Texinfo." (catch 'git-error (lambda () (let ((commit (commit-lookup repository
/**
 * part of Hydrilla
 * Routines for querying in-memory scriptbase, operating on data structures from
 * `scripbase.h'.
 *
 * Copyright (C) 2021 Wojtek Kosior
 * Redistribution terms are gathered in the `copyright' file.
 */

#include <stddef.h>
#include <regex.h>
#include <stdbool.h>
#include <string.h>

#include "hashtable.h"
#include "string_buf.h"

#include "scriptbase.h"

#define MAX_URL_PATH_LEN 12
#define MAX_URL_PATH_CHARS 255
#define MAX_DOMAIN_LEN 7
#define MAX_DOMAIN_CHARS 100

const struct script *get_script(const char *name, struct scriptbase *base)
{
	void *val;

	if (ht_get_threadsafe(&base->scripts, name, NULL, &val))
		return NULL;

	return ((struct script*) val)->filled ? val : NULL;
}

const struct bag *get_bag(const char *name, struct scriptbase *base)
{
	void *val;

	if (ht_get_threadsafe(&base->bags, name, NULL, &val))
		return NULL;

	return ((struct bag*) val)->filled ? val : NULL;
}

const struct page *get_pattern(const char *pattern, struct scriptbase *base)
{
	void *val = NULL;

	ht_get_threadsafe(&base->pag