blob: e0002fab0a46f3ec41f325a3cd4b40ac2848e51b [file] [log] [blame]
MG Mud User88f12472016-06-24 23:31:02 +02001// MorgenGrauen MUDlib
2//
3// secure/master/autoinclude.c -- module of the master object: Autoincludes
4//
5// $Id: master.c 7041 2008-10-13 18:18:27Z Zesstra $
6
7#define PRAGMA(x) "#pragma "x"\n"
8
9// fuer alte Homemuds...
10#if __VERSION__ >= "3.5.0"
11#define RTTCHECKS PRAGMA("rtt_checks")
12#define DEFAULTS PRAGMA("save_types")
13#else
14#define RTTCHECKS ""
15#define DEFAULTS PRAGMA("combine_strings, verbose_errors, warn_deprecated")
16#endif
17
18// geschachteltes Mapping in toplevel.region.magier Hierarchie.
19// Wichtig: jede Hierarchiebene _muss_ ein Mapping sein, welches einen Eintrag
20// 0 als Default enthaelt, welcher einen Strings als Wert hat.
21// Ausnahme: die letzte Ebene (Magierebene), die muss ein String ein.
22private nosave mapping autoincludes = ([
23 "d": ([
24 "inseln": ([
25 0: "",
26 "zesstra": PRAGMA("strong_types") RTTCHECKS,
27 ]),
28 0: "",
29 ]),
30 "std": ([
31 0: PRAGMA("strong_types,pedantic") RTTCHECKS,
32 ]),
33 "items": ([
34 0: PRAGMA("strong_types,pedantic") RTTCHECKS,
35 ]),
36 "secure": ([
37 0: PRAGMA("strong_types,range_check,pedantic") RTTCHECKS,
38 ]),
39 "p": ([
40 0: "",
41 "daemon": ([
42 0: PRAGMA("strong_types") RTTCHECKS
43 ]),
44 "service": ([
45 0: ""
46 ]),
47 ]),
48 0: DEFAULTS,
49]);
50
51string autoincludehook(string base_file, string current_file, int sys_include)
52{
53 mapping topleveldir, region; // mappings for spezialisiertere Pfade
54 string ainc_string;
55
56 // Wenn current_file != 0 ist, wird gerade vom kompilierten Objekt
57 // <base_file> etwas (indirekt) inkludiert. Dort duerfen die Pragmas
58 // keinesfalls reingeschrieben werden.
59 if (current_file)
60 return 0;
61
62 string res=autoincludes[0]; // global default.
63
64 string *p_arr = explode(base_file,"/")-({""});
65 //DEBUG(sprintf("AINC: File: %O, Pfad: %O\n",base_file, p_arr));
66
67 if (sizeof(p_arr) && m_contains(&topleveldir, autoincludes, p_arr[0])) {
68 // p_arr[0]: d, p, std, etc.
69 // erst wird der Defaulteintrag 0 genommen
70 res += topleveldir[0];
71 if (sizeof(p_arr) > 1 && m_contains(&region, topleveldir, p_arr[1])) {
72 // p_arr[1] ebene, polar, unterwelt, service, ...
73 // erst den Defaulteintrag der Region nehmen
74 res += region[0];
75 if (sizeof(p_arr) > 2 && m_contains(&ainc_string, region, p_arr[2])) {
76 // p_arr[2]: magiername. Fuer den Magier was hinterlegt.
77 res += ainc_string;
78 }
79 }
80 }
81 // Fuer aeltere Files schalten wir einige Warnungen explizit aus. :-(
82 // (1407179680 == "Mon, 4. Aug 2014, 21:14:40")
83#if MUDHOST == __HOST_NAME__
84 if (call_sefun("file_time", base_file) < 1407179680) {
85 res += PRAGMA("no_warn_missing_return");
86 }
87#else
88 // Auf anderen Rechnern als dem Mudrechner werden die Warnungen unabhaengig
89 // vom Zeitpunt der letztes Aenderung abgeschaltet, weil bei kopierten
90 // Mudlibs oft die mtimes geaendert werden und dann auf einmal alles scrollt.
91 res += PRAGMA("no_warn_missing_return");
92
93#endif
94 //DEBUG(res);
95 return res;
96}
97#undef RTTCHECKS
98#undef DEFAULTS
99#undef PRAGMA
100
101