blob: 187bd1e8df8899ca945db16c30f76f0c1ef4b4e2 [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
MG Mud User88f12472016-06-24 23:31:02 +02009#define RTTCHECKS PRAGMA("rtt_checks")
Zesstra000c16b2021-01-26 22:36:27 +010010#define DEFAULTS PRAGMA("save_types,warn_unused_variables")
MG Mud User88f12472016-06-24 23:31:02 +020011
12// geschachteltes Mapping in toplevel.region.magier Hierarchie.
13// Wichtig: jede Hierarchiebene _muss_ ein Mapping sein, welches einen Eintrag
14// 0 als Default enthaelt, welcher einen Strings als Wert hat.
15// Ausnahme: die letzte Ebene (Magierebene), die muss ein String ein.
16private nosave mapping autoincludes = ([
17 "d": ([
18 "inseln": ([
19 0: "",
20 "zesstra": PRAGMA("strong_types") RTTCHECKS,
21 ]),
22 0: "",
23 ]),
24 "std": ([
Zesstraac5b06f2019-11-26 21:20:03 +010025 0: PRAGMA("strong_types") RTTCHECKS,
MG Mud User88f12472016-06-24 23:31:02 +020026 ]),
27 "items": ([
Zesstraac5b06f2019-11-26 21:20:03 +010028 0: PRAGMA("strong_types") RTTCHECKS,
MG Mud User88f12472016-06-24 23:31:02 +020029 ]),
30 "secure": ([
Zesstraac5b06f2019-11-26 21:20:03 +010031 0: PRAGMA("strong_types,range_check") RTTCHECKS,
MG Mud User88f12472016-06-24 23:31:02 +020032 ]),
33 "p": ([
34 0: "",
35 "daemon": ([
36 0: PRAGMA("strong_types") RTTCHECKS
37 ]),
38 "service": ([
39 0: ""
40 ]),
41 ]),
42 0: DEFAULTS,
43]);
44
45string autoincludehook(string base_file, string current_file, int sys_include)
46{
47 mapping topleveldir, region; // mappings for spezialisiertere Pfade
48 string ainc_string;
49
50 // Wenn current_file != 0 ist, wird gerade vom kompilierten Objekt
51 // <base_file> etwas (indirekt) inkludiert. Dort duerfen die Pragmas
52 // keinesfalls reingeschrieben werden.
53 if (current_file)
54 return 0;
55
56 string res=autoincludes[0]; // global default.
57
58 string *p_arr = explode(base_file,"/")-({""});
59 //DEBUG(sprintf("AINC: File: %O, Pfad: %O\n",base_file, p_arr));
60
61 if (sizeof(p_arr) && m_contains(&topleveldir, autoincludes, p_arr[0])) {
62 // p_arr[0]: d, p, std, etc.
63 // erst wird der Defaulteintrag 0 genommen
64 res += topleveldir[0];
65 if (sizeof(p_arr) > 1 && m_contains(&region, topleveldir, p_arr[1])) {
66 // p_arr[1] ebene, polar, unterwelt, service, ...
67 // erst den Defaulteintrag der Region nehmen
68 res += region[0];
69 if (sizeof(p_arr) > 2 && m_contains(&ainc_string, region, p_arr[2])) {
70 // p_arr[2]: magiername. Fuer den Magier was hinterlegt.
71 res += ainc_string;
72 }
73 }
74 }
75 // Fuer aeltere Files schalten wir einige Warnungen explizit aus. :-(
76 // (1407179680 == "Mon, 4. Aug 2014, 21:14:40")
Zesstra085be172019-05-27 22:04:04 +020077 // Auf anderen Rechnern als dem Mudrechner werden die Warnungen nur
78 // eingeschaltet, wenn die Files seit dem Mudstart geaendert wurden.
79 // Hintergrund: bei kopierten Mudlibs werden oft die mtimes geaendert und
80 // dann scrollt auf einmal alles. Aber wenn man nach dem Mudstart was
81 // aendert, ist es vermutlich ne einzelne, gezielte Aenderung an einem File.
MG Mud User88f12472016-06-24 23:31:02 +020082#if MUDHOST == __HOST_NAME__
Zesstra085be172019-05-27 22:04:04 +020083 if (call_sefun("file_time", base_file) < 1407179680)
84#else
85 if (call_sefun("file_time", base_file) < __BOOT_TIME__)
86#endif
87 {
Zesstra5155b6e2021-02-06 23:06:15 +010088 res += PRAGMA("no_warn_missing_return,no_warn_unused_variables");
MG Mud User88f12472016-06-24 23:31:02 +020089 }
MG Mud User88f12472016-06-24 23:31:02 +020090 //DEBUG(res);
91 return res;
92}
93#undef RTTCHECKS
94#undef DEFAULTS
95#undef PRAGMA
96
97