00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027 #include <defs.h>
00028 #include <iostream>
00029 #include <fstream>
00030 #include <string.h>
00031 #include <ext/hash_map>
00032 #include <stdlib.h>
00033
00034 #include "mempool.h"
00035 #include "cxx_memory.h"
00036 #include "errors.h"
00037 #include "f2c_abi_utils.h"
00038
00039 extern "C" {
00040 #include "../fe90/printmsg.h"
00041 }
00042
00043 typedef __gnu_cxx::hash_map<const char*, const char *, __gnu_cxx::hash<const char*>, eqstr> KEY_TARGET_HTABLE;
00044 static KEY_TARGET_HTABLE spec_table;
00045 typedef __gnu_cxx::hash_map<const char*, void*, __gnu_cxx::hash<const char*>, eqstr> char_to_void_htable;
00046 static char_to_void_htable binding_labels;
00047 extern MEM_POOL *FE_Mempool;
00048 using namespace std;
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058 void parse_decorate_script(const char *script_name)
00059 {
00060
00061 char line_buffer[1024], *line_iterator;
00062 ifstream infile;
00063 char *key, *key_temp, *target, *target_temp;
00064
00065 infile.open(script_name, ifstream::in);
00066
00067 if (!infile.good()) {
00068 PRINTMSG(0, 1676, Log_Error, 0, script_name, strerror(errno));
00069 return;
00070 }
00071
00072
00073
00074 while (infile.good()) {
00075 infile.getline(line_buffer, 1024);
00076 line_iterator = line_buffer;
00077
00078
00079 while (*line_iterator == ' ')
00080 line_iterator++;
00081 key = strtok(line_iterator, " \t");
00082 if (!key)
00083 continue;
00084 key_temp = new char[sizeof(char)*(strlen(key)+1)];
00085 strcpy(key_temp, key);
00086 target = strtok(NULL, " \t");
00087
00088 int abbrev = 0;
00089
00090 if (0 == target || '0' == *target && 0 == target[1]) {
00091 target = key;
00092 }
00093 else if ('1' == *target && 0 == target[1]) {
00094 target = key;
00095 abbrev = 1;
00096 }
00097 else if ('2' == *target && 0 == target[1]) {
00098 target = key;
00099 abbrev = 2;
00100 }
00101
00102
00103 target_temp = new char[sizeof(char)*(strlen(target)+abbrev+1)];
00104
00105 switch (abbrev) {
00106 case 0:
00107 strcpy(target_temp, target);
00108 break;
00109 case 1:
00110 strcat(strcpy(target_temp, target), "_");
00111 break;
00112 case 2:
00113 strcat(strcpy(target_temp, target),
00114 (strchr(target, '_') ? "__" : "_"));
00115 break;
00116 }
00117
00118 spec_table[key_temp] = target_temp;
00119 }
00120 infile.close();
00121 }
00122
00123
00124
00125
00126
00127 extern "C" const char *get_symbol_decoration(const char *key)
00128 {
00129 return (spec_table.find(key) == spec_table.end()) ?
00130 0 :
00131 spec_table[key];
00132 }
00133
00134
00135
00136
00137 extern "C" void put_external_label(const char *key, void *info)
00138 {
00139 char *key_temp = new char[::strlen(key) + 1];
00140 ::strcpy(key_temp, key);
00141 binding_labels[key_temp] = info;
00142 }
00143
00144
00145
00146
00147 extern "C" void *get_external_label(const char *key)
00148 {
00149 return (binding_labels.find(key) == binding_labels.end()) ?
00150 0 :
00151 binding_labels[key];
00152 }