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);
75void envdelvar(struct Env *env, const char *name);
76struct Target *findtarget(struct Graph *graph, const char *name);
77const struct Target *findctarget(const struct Graph *graph, const char *name);
78struct Target *gettarget(struct Graph *graph, const char *name, int *added);
79void reindexgraph(struct Graph *graph);
80const char *firstprereq(const struct Target *t);
81char *joinallprereqs(const struct Target *t, const char *sep);
82size_t totalprereqs(const struct Target *t);
83void initspecialtargets(struct SpecialTargets *targets);
84void updatespecialassign(struct SpecialTargets *targets, const char *lhs, const char *rhs);
85int handlespecialrule(struct SpecialTargets *targets, const struct RuleNode *rule);
86
87struct Var *findvar(struct Env *env, const char *name);
88char *expandstr(struct EvalCtx *ctx, const char *s);
89void seedenv(struct Env *env, int posix, int envoverride, enum ShinMode mode);
90void freeenv(struct Env *env);
91void copyenv(struct Env *dst, const struct Env *src);
92void evalassign(struct EvalCtx *ctx, const struct AssignNode *in);
93
94char *fnwildcard(const char *patterns);
95char *fnshell(const char *cmd);
96char *fnfilter(const char *patterns, const char *text);
97char *fnfilterout(const char *patterns, const char *text);
98char *fnfindstring(const char *find, const char *in);
99char *fnaddprefix(const char *prefix, const char *names);
100char *fnaddsuffix(const char *suffix, const char *names);
101char *fnjoin(const char *list1, const char *list2);
102char *fnstrip(const char *text);
103char *fnsort(const char *text);
104char *fninfo(struct EvalCtx *ctx, const char *args);
105char *fnorigin(struct EvalCtx *ctx, const char *args);
106char *fnvalue(struct EvalCtx *ctx, const char *args);
107char *fnnotdir(const char *names);
108char *fndir(const char *names);
109char *fnbasename(const char *names);
110char *fnsubst(const char *from, const char *to, const char *text);
111char *fnpatsubst(const char *pattern, const char *replacement, const char *text);
112char *fnif(const char *cond, const char *then, const char *otherwise);
113char *fnor(struct EvalCtx *ctx, const char *args);
114char *fnwords(const char *text);
115char *fnword(const char *n, const char *list);
116char *fnwordlist(const char *s, const char *e, const char *list);
117char *fnfirstword(const char *list);
118char *fnlastword(const char *list);
119char *fnrealpath(const char *path);
120char *fnabspath(const char *path);
121
122char *fncall(struct EvalCtx *ctx, const char *args);
123char *fnforeach(struct EvalCtx *ctx, const char *args);
124char *fneval(struct EvalCtx *ctx, const char *args);
125int evalsnippet(struct EvalCtx *ctx, const char *path, const char *src);
126
127const char *shinmode_name(enum ShinMode mode);
128int shinmode_parse(const char *s, enum ShinMode *out);
129
130#endif