blob: 04ae83086db29b50e362113ff49cce012f623067 [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,
MG Mud User88f12472016-06-24 23:31:02 +020027 ]),
28 "items": ([
Zesstraac5b06f2019-11-26 21:20:03 +010029 0: PRAGMA("strong_types") RTTCHECKS,
MG Mud User88f12472016-06-24 23:31:02 +020030 ]),
31 "secure": ([
Zesstraac5b06f2019-11-26 21:20:03 +010032 0: PRAGMA("strong_types,range_check") RTTCHECKS,
MG Mud User88f12472016-06-24 23:31:02 +020033 ]),
34 "p": ([
35 0: "",
36 "daemon": ([
37 0: PRAGMA("strong_types") RTTCHECKS
38 ]),
39 "service": ([
40 0: ""
41 ]),
42 ]),
43 0: DEFAULTS,
44]);
45
46string autoincludehook(string base_file, string current_file, int sys_include)
47{
48 mapping topleveldir, region; // mappings for spezialisiertere Pfade
49 string ainc_string;
50
51 // Wenn current_file != 0 ist, wird gerade vom kompilierten Objekt
52 // <base_file> etwas (indirekt) inkludiert. Dort duerfen die Pragmas
53 // keinesfalls reingeschrieben werden.
54 if (current_file)
55 return 0;
56
Zesstrad55b0e82021-05-14 17:16:51 +020057 // Zuerst den global default holen.
58 string res=autoincludes[0];
MG Mud User88f12472016-06-24 23:31:02 +020059
MG Mud User88f12472016-06-24 23:31:02 +020060 // Fuer aeltere Files schalten wir einige Warnungen explizit aus. :-(
61 // (1407179680 == "Mon, 4. Aug 2014, 21:14:40")
Zesstra0d7c6482021-05-07 09:44:56 +020062 // (1609455600 == "Fre, 1. Jan 2021, 00:00:00")
Zesstra085be172019-05-27 22:04:04 +020063 // Auf anderen Rechnern als dem Mudrechner werden die Warnungen nur
64 // eingeschaltet, wenn die Files seit dem Mudstart geaendert wurden.
65 // Hintergrund: bei kopierten Mudlibs werden oft die mtimes geaendert und
66 // dann scrollt auf einmal alles. Aber wenn man nach dem Mudstart was
67 // aendert, ist es vermutlich ne einzelne, gezielte Aenderung an einem File.
MG Mud User88f12472016-06-24 23:31:02 +020068#if MUDHOST == __HOST_NAME__
Zesstra63713442021-05-09 10:02:37 +020069 switch(call_sefun("file_time", base_file))
Zesstra0d7c6482021-05-07 09:44:56 +020070 {
Zesstra63713442021-05-09 10:02:37 +020071 case 0 .. 1407179680:
72 res += PRAGMA("no_warn_missing_return");
73 // Fall-through, die naechsten kommen auch dazu
74 case 1407179681 .. 1609455600:
Zesstra775b6bd2021-05-08 13:59:14 +020075 res += PRAGMA("no_warn_unused_variables,no_warn_dead_code,\
76 no_warn_applied_functions");
Zesstra63713442021-05-09 10:02:37 +020077 // Fall-through
Zesstra0d7c6482021-05-07 09:44:56 +020078 }
Zesstra085be172019-05-27 22:04:04 +020079#else
80 if (call_sefun("file_time", base_file) < __BOOT_TIME__)
Zesstra085be172019-05-27 22:04:04 +020081 {
Zesstra775b6bd2021-05-08 13:59:14 +020082 res += PRAGMA("no_warn_missing_return,no_warn_unused_variables,\
83 no_warn_dead_code,no_warn_applied_functions");
MG Mud User88f12472016-06-24 23:31:02 +020084 }
Zesstra0d7c6482021-05-07 09:44:56 +020085#endif
Zesstrad55b0e82021-05-14 17:16:51 +020086
87 // Aber schlussendlich werden jetzt noch Einstellungen fuer bestimmte,
88 // gezielt konfigurierte Verzeichnisse ermittelt. (Diese ueberschreiben ggf.
89 // auch die abgeschalteten Warnungen oben.)
90
91 string *p_arr = explode(base_file,"/")-({""});
92 //DEBUG(sprintf("AINC: File: %O, Pfad: %O\n",base_file, p_arr));
93
94 if (sizeof(p_arr) && m_contains(&topleveldir, autoincludes, p_arr[0])) {
95 // p_arr[0]: d, p, std, etc.
96 // erst wird der Defaulteintrag 0 genommen
97 res += topleveldir[0];
98 if (sizeof(p_arr) > 1 && m_contains(&region, topleveldir, p_arr[1])) {
99 // p_arr[1] ebene, polar, unterwelt, service, ...
100 // erst den Defaulteintrag der Region nehmen
101 res += region[0];
102 if (sizeof(p_arr) > 2 && m_contains(&ainc_string, region, p_arr[2])) {
103 // p_arr[2]: magiername. Fuer den Magier was hinterlegt.
104 res += ainc_string;
105 }
106 }
107 }
MG Mud User88f12472016-06-24 23:31:02 +0200108 //DEBUG(res);
109 return res;
110}
111#undef RTTCHECKS
112#undef DEFAULTS
113#undef PRAGMA
114
115