PNP0A03
     �_’I|¥‰ÓMjqØ‚¦ð¬÷À¿      File not found.
  *   ˆl–Ü4ý( ©³( 	Å€fàB¦-ÿÂƒ®·_†I|¥�+ÂÁ ï    /* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Industrial I/O software trigger interface
 *
 * Copyright (c) 2015 Intel Corporation
 */

#ifndef __IIO_SW_TRIGGER
#define __IIO_SW_TRIGGER

#include <linux/module.h>
#include <linux/device.h>
#include <linux/iio/iio.h>
#include <linux/configfs.h>

#define module_iio_sw_trigger_driver(__iio_sw_trigger_type) \
	module_driver(__iio_sw_trigger_type, iio_register_sw_trigger_type, \
		      iio_unregister_sw_trigger_type)

struct iio_sw_trigger_ops;

struct iio_sw_trigger_type {
	const char *name;
	struct module *owner;
	const struct iio_sw_trigger_ops *ops;
	struct list_head list;
	struct config_group *group;
};

struct iio_sw_trigger {
	struct iio_trigger *trigger;
	struct iio_sw_trigger_type *trigger_type;
	struct config_group group;
};

struct iio_sw_trigger_ops {
	struct iio_sw_trigger* (*probe)(const char *);
	int (*remove)(struct iio_sw_trigger *);
};

static inline
struct iio_sw_trigger *to_iio_sw_trigger(struct config_item *item)
{
	return container_of(to_config_group(item), struct iio_sw_trigger,
			    group);
}

int iio_register_sw_trigger_type(struct iio_sw_trigger_type *tt);
void iio_unregister_sw_trigger_type(struct iio_sw_trigger_type *tt);

struct iio_sw_trigger *iio_sw_trigger_create(const char *, const char *);
void iio_sw_trigger_destroy(struct iio_sw_trigger *);

int iio_sw_trigger_type_configfs_register(struct iio_sw_trigger_type *tt);
void iio_sw_trigger_type_configfs_unregister(struct iio_sw_trigger_type *tt);

static inline
void iio_swt_group_init_type_name(struct iio_sw_trigger *t,
				  const char *name,
				  const struct config_item_type *type)
{
#if IS_ENABLED(CONFIG_CONFIGFS_FS)
	config_group_init_type_name(&t->group, name, type);
#endif
}

#endif /* __IIO_SW_TRIGGER */
     ˆ¿Ã„Dë_¾ÂÁ ,
    // SPDX-License-Identifier: GPL-2.0
//
// Copyright (C) 2018 Masahiro Yamada <yamada.masahiro@socionext.com>

#include <ctype.h>
#include <stdarg.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "list.h"
#include <xalloc.h>
#include "lkc.h"

#define ARRAY_SIZE(arr)		(sizeof(arr) / sizeof((arr)[0]))

static char *expand_string_with_args(const char *in, int argc, char *argv[]);
static char *expand_string(const char *in);

static void __attribute__((noreturn)) pperror(const char *format, ...)
{
	va_list ap;

	fprintf(stderr, "%s:%d: ", current_file->name, yylineno);
	va_start(ap, format);
	vfprintf(stderr, format, ap);
	va_end(ap);
	fprintf(stderr, "\n");

	exit(1);
}

/*
 * Environment variables
 */
static LIST_HEAD(env_list);

struct env {
	char *name;
	char *value;
	struct list_head node;
};

static void env_add(const char *name, const char *value)
{
	struct env *e;

	e = xmalloc(sizeof(*e));
	e->name = xstrdup(name);
	e->value = xstrdup(value);

	list_add_tail(&e->node, &env_list);
}

static void env_del(struct env *e)
{
	list_del(&e->node);
	free(e->name);
	free(e->value);
	free(e);
}

/* The returned pointer must be freed when done */
static char *env_expand(const char *name)
{
	struct env *e;
	const char *value;

	if (!*name)
		return NULL;

	list_for_each_entry(e, &env_list, node) {
		if (!strcmp(name, e->name))
			return xstrdup(e->value);
	}

	value = getenv(name);
	if (!value)
		return NULL;

	/*
	 * We need to remember all referenced environment variables.
	 * They will be written out to include/config/auto.conf.cmd
	 */
	env_add(name, value);

	return xstrdup(value);
}

void env_write_dep(FILE *f, const char *autoconfig_name)
{
	struct env *e, *tmp;

	list_for_each_entry_safe(e, tmp, &env_list, node) {
		fprintf(f, "ifneq \"$(%s)\" \"%s\"\n", e->name, e->value);
		fprintf(f, "%s: FORCE\n", autoconfig_name);
		fprintf(f, "endif\n");
		env_del(e);
	}
}

/*
 * Built-in functions
 */
struct function {
	const char *name;
	unsigned int min_args;
	unsigned int max_args;
	char *(*func)(int argc, char *argv[]);
};

static char *do_error_if(int argc, char *argv[])
{
	if (!strcmp(argv[