main shrub/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);
 60int usesub(const struct Graph *graph, size_t idx);
 61const struct Target *defaulttarget(const struct Graph *graph, const char *owner);
 62void addnode(struct NodeList *list, struct Node node);
 63void splitwords(struct StrList *out, const char *s, size_t n);
 64char *cat3(const char *a, const char *b, const char *c);
 65void addwords(struct StrList *dest, const struct StrList *src);
 66void adduniqwords(struct StrList *dest, const struct StrList *src);
 67void addrecipe(struct RecipeList *dest, const char *raw);
 68void addrecipes(struct RecipeList *dest, const struct RecipeList *src);
 69void freestrs(struct StrList *list);
 70void freerecipes(struct RecipeList *list);
 71void freesubmake(struct SubMake *sm);
 72void copysubmake(struct SubMake *dst, const struct SubMake *src);
 73int parsesubmake(struct SubMake *dst, const char *cmd);
 74void envsetvar(struct Env *env, const char *name, char *val, int simple, enum Origin origin,
 75               int exported);
 76void envdelvar(struct Env *env, const char *name);
 77struct Target *findtarget(struct Graph *graph, const char *name);
 78const struct Target *findctarget(const struct Graph *graph, const char *name);
 79struct Target *gettarget(struct Graph *graph, const char *name, int *added);
 80void reindexgraph(struct Graph *graph);
 81const char *firstprereq(const struct Target *t);
 82char *joinallprereqs(const struct Target *t, const char *sep);
 83size_t totalprereqs(const struct Target *t);
 84void initspecialtargets(struct SpecialTargets *targets);
 85void updatespecialassign(struct SpecialTargets *targets, const char *lhs, const char *rhs);
 86int handlespecialrule(struct SpecialTargets *targets, const struct RuleNode *rule);
 87
 88struct Var *findvar(struct Env *env, const char *name);
 89char *expandstr(struct EvalCtx *ctx, const char *s);
 90void seedenv(struct Env *env, int posix, int envoverride, enum ShinMode mode);
 91void freeenv(struct Env *env);
 92void copyenv(struct Env *dst, const struct Env *src);
 93void evalassign(struct EvalCtx *ctx, const struct AssignNode *in);
 94
 95char *fnwildcard(const char *patterns);
 96char *fnshell(const char *cmd);
 97char *fnfilter(const char *patterns, const char *text);
 98char *fnfilterout(const char *patterns, const char *text);
 99char *fnfindstring(const char *find, const char *in);
100char *fnaddprefix(const char *prefix, const char *names);
101char *fnaddsuffix(const char *suffix, const char *names);
102char *fnjoin(const char *list1, const char *list2);
103char *fnstrip(const char *text);
104char *fnsort(const char *text);
105char *fninfo(struct EvalCtx *ctx, const char *args);
106char *fnorigin(struct EvalCtx *ctx, const char *args);
107char *fnvalue(struct EvalCtx *ctx, const char *args);
108char *fnnotdir(const char *names);
109char *fndir(const char *names);
110char *fnbasename(const char *names);
111char *fnsubst(const char *from, const char *to, const char *text);
112char *fnpatsubst(const char *pattern, const char *replacement, const char *text);
113char *fnif(const char *cond, const char *then, const char *otherwise);
114char *fnor(struct EvalCtx *ctx, const char *args);
115char *fnwords(const char *text);
116char *fnword(const char *n, const char *list);
117char *fnwordlist(const char *s, const char *e, const char *list);
118char *fnfirstword(const char *list);
119char *fnlastword(const char *list);
120char *fnrealpath(const char *path);
121char *fnabspath(const char *path);
122
123char *fncall(struct EvalCtx *ctx, const char *args);
124char *fnforeach(struct EvalCtx *ctx, const char *args);
125char *fneval(struct EvalCtx *ctx, const char *args);
126int evalsnippet(struct EvalCtx *ctx, const char *path, const char *src);
127
128const char *shinmode_name(enum ShinMode mode);
129int shinmode_parse(const char *s, enum ShinMode *out);
130
131#endif