blob: 4e52777344438d466221a1255b18e8a82c3924aa [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")
Zesstra9b788912021-05-08 12:00:37 +020010#define DEFAULTS PRAGMA("save_types,warn_unused_variables,\
11 warn_applied_functions,warn_dead_code")
MG Mud User88f12472016-06-24 23:31:02 +020012
13// geschachteltes Mapping in toplevel.region.magier Hierarchie.
14// Wichtig: jede Hierarchiebene _muss_ ein Mapping sein, welches einen Eintrag
15// 0 als Default enthaelt, welcher einen Strings als Wert hat.
16// Ausnahme: die letzte Ebene (Magierebene), die muss ein String ein.
17private nosave mapping autoincludes = ([
18 "d": ([
19 "inseln": ([
20 0: "",
21 "zesstra": PRAGMA("strong_types") RTTCHECKS,
22 ]),
23 0: "",
24 ]),
25 "std": ([
Zesstraac5b06f2019-11-26 21:20:03 +010026 0: PRAGMA("strong_types") RTTCHECKS,
Zesstra8e45f022021-05-14 17:22:53 +020027 "lwo": ([
28 0: PRAGMA("lightweight"),
29 ]),
MG Mud User88f12472016-06-24 23:31:02 +020030 ]),
31 "items": ([
Zesstraac5b06f2019-11-26 21:20:03 +010032 0: PRAGMA("strong_types") RTTCHECKS,
MG Mud User88f12472016-06-24 23:31:02 +020033 ]),
34 "secure": ([
Zesstraac5b06f2019-11-26 21:20:03 +010035 0: PRAGMA("strong_types,range_check") RTTCHECKS,
MG Mud User88f12472016-06-24 23:31:02 +020036 ]),
Zesstra8e45f022021-05-14 17:22:53 +020037 "obj": ([
38 0: "",
39 "lwo": ([
40 0: PRAGMA("strong_types,lightweight") RTTCHECKS,
41 ]),
42 ]),
MG Mud User88f12472016-06-24 23:31:02 +020043 "p": ([
44 0: "",
45 "daemon": ([
Zesstra8e45f022021-05-14 17:22:53 +020046 0: PRAGMA("strong_types") RTTCHECKS,
MG Mud User88f12472016-06-24 23:31:02 +020047 ]),
48 "service": ([
Zesstra8e45f022021-05-14 17:22:53 +020049 0: "",
50 "padreic": PRAGMA("strong_types") RTTCHECKS,
MG Mud User88f12472016-06-24 23:31:02 +020051 ]),
52 ]),
53 0: DEFAULTS,
54]);
55
56string autoincludehook(string base_file, string current_file, int sys_include)
57{
58 mapping topleveldir, region; // mappings for spezialisiertere Pfade
59 string ainc_string;
60
61 // Wenn current_file != 0 ist, wird gerade vom kompilierten Objekt
62 // <base_file> etwas (indirekt) inkludiert. Dort duerfen die Pragmas
63 // keinesfalls reingeschrieben werden.
64 if (current_file)
65 return 0;
66
Zesstrad55b0e82021-05-14 17:16:51 +020067 // Zuerst den global default holen.
68 string res=autoincludes[0];
MG Mud User88f12472016-06-24 23:31:02 +020069
MG Mud User88f12472016-06-24 23:31:02 +020070 // Fuer aeltere Files schalten wir einige Warnungen explizit aus. :-(
71 // (1407179680 == "Mon, 4. Aug 2014, 21:14:40")
Zesstra0d7c6482021-05-07 09:44:56 +020072 // (1609455600 == "Fre, 1. Jan 2021, 00:00:00")
Zesstra085be172019-05-27 22:04:04 +020073 // Auf anderen Rechnern als dem Mudrechner werden die Warnungen nur
74 // eingeschaltet, wenn die Files seit dem Mudstart geaendert wurden.
75 // Hintergrund: bei kopierten Mudlibs werden oft die mtimes geaendert und
76 // dann scrollt auf einmal alles. Aber wenn man nach dem Mudstart was
77 // aendert, ist es vermutlich ne einzelne, gezielte Aenderung an einem File.
MG Mud User88f12472016-06-24 23:31:02 +020078#if MUDHOST == __HOST_NAME__
Zesstra63713442021-05-09 10:02:37 +020079 switch(call_sefun("file_time", base_file))
Zesstra0d7c6482021-05-07 09:44:56 +020080 {
Zesstra63713442021-05-09 10:02:37 +020081 case 0 .. 1407179680:
82 res += PRAGMA("no_warn_missing_return");
83 // Fall-through, die naechsten kommen auch dazu
84 case 1407179681 .. 1609455600:
Zesstra775b6bd2021-05-08 13:59:14 +020085 res += PRAGMA("no_warn_unused_variables,no_warn_dead_code,\
86 no_warn_applied_functions");
Zesstra63713442021-05-09 10:02:37 +020087 // Fall-through
Zesstra0d7c6482021-05-07 09:44:56 +020088 }
Zesstra085be172019-05-27 22:04:04 +020089#else
90 if (call_sefun("file_time", base_file) < __BOOT_TIME__)
Zesstra085be172019-05-27 22:04:04 +020091 {
Zesstra775b6bd2021-05-08 13:59:14 +020092 res += PRAGMA("no_warn_missing_return,no_warn_unused_variables,\
93 no_warn_dead_code,no_warn_applied_functions");
MG Mud User88f12472016-06-24 23:31:02 +020094 }
Zesstra0d7c6482021-05-07 09:44:56 +020095#endif
Zesstrad55b0e82021-05-14 17:16:51 +020096
97 // Aber schlussendlich werden jetzt noch Einstellungen fuer bestimmte,
98 // gezielt konfigurierte Verzeichnisse ermittelt. (Diese ueberschreiben ggf.
99 // auch die abgeschalteten Warnungen oben.)
100
101 string *p_arr = explode(base_file,"/")-({""});
102 //DEBUG(sprintf("AINC: File: %O, Pfad: %O\n",base_file, p_arr));
103
104 if (sizeof(p_arr) && m_contains(&topleveldir, autoincludes, p_arr[0])) {
105 // p_arr[0]: d, p, std, etc.
106 // erst wird der Defaulteintrag 0 genommen
107 res += topleveldir[0];
108 if (sizeof(p_arr) > 1 && m_contains(&region, topleveldir, p_arr[1])) {
109 // p_arr[1] ebene, polar, unterwelt, service, ...
110 // erst den Defaulteintrag der Region nehmen
111 res += region[0];
112 if (sizeof(p_arr) > 2 && m_contains(&ainc_string, region, p_arr[2])) {
113 // p_arr[2]: magiername. Fuer den Magier was hinterlegt.
114 res += ainc_string;
115 }
116 }
117 }
MG Mud User88f12472016-06-24 23:31:02 +0200118 //DEBUG(res);
119 return res;
120}
121#undef RTTCHECKS
122#undef DEFAULTS
123#undef PRAGMA
124
125