main shinobi / src / internal.h
  1#ifndef INTERNAL_H
  2#define INTERNAL_H
  3
  4#include "shinobi.h"
  5
  6struct CallFrame {
  7	char **args;
  8	size_t nargs;
  9	struct CallFrame *next;
 10};
 11
 12struct EvalCtx {
 13	struct Env *env;
 14	struct RuleSet *out;
 15	struct CallFrame *call;
 16	const char *auto_target;
 17	const struct StrList *auto_prereqs;
 18	const char *auto_stem;
 19	int errors;
 20	int avoid_io;
 21	struct StrList *side_effects;
 22	const char *cur_path;
 23	int cur_line;
 24	struct StrList exports;
 25	struct StrList unexports;
 26	int export_all;
 27	enum ShinMode mode;
 28};
 29
 30struct SpecialTargets {
 31	int posix;
 32	struct StrList phony;
 33	char recipeprefix;
 34	int export_all;
 35};
 36
 37void *xmalloc(size_t n);
 38void set_progname(const char *name);
 39void warnlikemake(const char *path, int line, const char *msg);
 40void dielikemake(const char *path, int line, const char *msg, const char *detail);
 41void *xrealloc(void *p, size_t n);
 42char *xstrndup(const char *s, size_t n);
 43char *xstrdup(const char *s);
 44void arena_init(struct Arena *a, size_t block_size);
 45void *arena_alloc(struct Arena *a, size_t n);
 46char *arena_strndup(struct Arena *a, const char *s, size_t n);
 47char *arena_strdup(struct Arena *a, const char *s);
 48void arena_free(struct Arena *a);
 49const char *intern(const char *s);
 50char *readfile(const char *path);
 51int loadmakefile(const char *path, char **path_out, char **src_out);
 52char *appendassigns(char *src, const struct StrList *assigns);
 53char *getcwddup(void);
 54char *joinpath(const char *dir, const char *name);
 55char *normpath(const char *path);
 56char *joinstrs(const struct StrList *list, const char *sep);
 57void addstr(struct StrList *list, const char *s);
 58int hasword(const struct StrList *list, const char *word);
 59int targetownedby(const struct Target *t, const char *owner);
 60const struct Target *defaulttarget(const struct Graph *graph, const char *owner);
 61void addnode(struct NodeList *list, struct Node node);
 62void splitwords(struct StrList *out, const char *s, size_t n);
 63char *cat3(const char *a, const char *b, const char *c);
 64void addwords(struct StrList *dest, const struct StrList *src);
 65void adduniqwords(struct StrList *dest, const struct StrList *src);
 66void addrecipe(struct RecipeList *dest, const char *raw);
 67void addrecipes(struct RecipeList *dest, const struct RecipeList *src);
 68void freestrs(struct StrList *list);
 69void freerecipes(struct RecipeList *list);
 70void freesubmake(struct SubMake *sm);
 71void copysubmake(struct SubMake *dst, const struct SubMake *src);
 72int parsesubmake(struct SubMake *dst, const char *cmd);
 73void envsetvar(struct Env *env, const char *name, char *val, int simple, enum Origin origin,
 74               int exported);
 75struct Target *findtarget(struct Graph *graph, const char *name);
 76const struct Target *findctarget(const struct Graph *graph, const char *name);
 77const char *firstprereq(const struct Target *t);
 78char *joinallprereqs(const struct Target *t, const char *sep);
 79size_t totalprereqs(const struct Target *t);
 80void initspecialtargets(struct SpecialTargets *targets);
 81void updatespecialassign(struct SpecialTargets *targets, const char *lhs, const char *rhs);
 82int handlespecialrule(struct SpecialTargets *targets, const struct RuleNode *rule);
 83
 84struct Var *findvar(struct Env *env, const char *name);
 85char *expandstr(struct EvalCtx *ctx, const char *s);
 86void seedenv(struct Env *env, int posix, int envoverride, enum ShinMode mode);
 87void freeenv(struct Env *env);
 88void copyenv(struct Env *dst, const struct Env *src);
 89void evalassign(struct EvalCtx *ctx, const struct AssignNode *in);
 90
 91char *fnwildcard(const char *patterns);
 92char *fnshell(const char *cmd);
 93char *fnfilter(const char *patterns, const char *text);
 94char *fnfilterout(const char *patterns, const char *text);
 95char *fnfindstring(const char *find, const char *in);
 96char *fnaddprefix(const char *prefix, const char *names);
 97char *fnaddsuffix(const char *suffix, const char *names);
 98char *fnjoin(const char *list1, const char *list2);
 99char *fnstrip(const char *text);
100char *fnsort(const char *text);
101char *fninfo(struct EvalCtx *ctx, const char *args);
102char *fnorigin(struct EvalCtx *ctx, const char *args);
103char *fnvalue(struct EvalCtx *ctx, const char *args);
104char *fnnotdir(const char *names);
105char *fndir(const char *names);
106char *fnbasename(const char *names);
107char *fnsubst(const char *from, const char *to, const char *text);
108char *fnpatsubst(const char *pattern, const char *replacement, const char *text);
109char *fnif(const char *cond, const char *then, const char *otherwise);
110char *fnwords(const char *text);
111char *fnword(const char *n, const char *list);
112char *fnwordlist(const char *s, const char *e, const char *list);
113char *fnfirstword(const char *list);
114char *fnlastword(const char *list);
115char *fnrealpath(const char *path);
116char *fnabspath(const char *path);
117
118char *fncall(struct EvalCtx *ctx, const char *args);
119char *fnforeach(struct EvalCtx *ctx, const char *args);
120char *fneval(struct EvalCtx *ctx, const char *args);
121int evalsnippet(struct EvalCtx *ctx, const char *path, const char *src);
122
123const char *shinmode_name(enum ShinMode mode);
124int shinmode_parse(const char *s, enum ShinMode *out);
125
126#endif