MG Mud User | 88f1247 | 2016-06-24 23:31:02 +0200 | [diff] [blame^] | 1 | // 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. |
| 22 | private 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 | |
| 51 | string 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(®ion, 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 | |