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
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053 #include <stdio.h>
00054 #include <stdlib.h>
00055 #include <string.h>
00056
00057 #include "dra_demangle.h"
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068 #define DRA_MANGLE_SIG "__nn__"
00069 #define DRA_MANGLE_SIG_LEN 6
00070
00071 #define DRA_STAR_CODE 'S'
00072 #define DRA_BLOCK_CODE 'B'
00073 #define DRA_CYCLIC_CODE 'C'
00074 #define DRA_NDIMS_END 'D'
00075 #define DRA_ESIZE_END 'E'
00076 #define DRA_ARG_SEPARATOR '_'
00077
00078 #define DRA_STAR_STRING "*"
00079 #define DRA_BLOCK_STRING "BLOCK"
00080 #define DRA_CYCLIC_STRING "CYCLIC"
00081
00082 #define DRA_DEM_BUFSIZE 4096
00083
00084 static char dem_buf[DRA_DEM_BUFSIZE];
00085
00086
00087
00088
00089
00090
00091
00092 char*
00093 DRA_Demangle_Func(const char *mangled_name)
00094 {
00095 char *func_name;
00096 char *postfix_sig;
00097 int func_name_len;
00098
00099
00100 if (mangled_name == NULL ||
00101 strncmp(mangled_name, DRA_MANGLE_SIG, DRA_MANGLE_SIG_LEN) != 0)
00102 return NULL;
00103
00104 func_name = (char*) mangled_name + DRA_MANGLE_SIG_LEN;
00105
00106
00107 postfix_sig = strstr(func_name, DRA_MANGLE_SIG);
00108
00109 if (postfix_sig == NULL ||
00110 postfix_sig[DRA_MANGLE_SIG_LEN] == 0)
00111 return NULL;
00112
00113
00114 func_name_len = postfix_sig - func_name;
00115 if (func_name_len >= DRA_DEM_BUFSIZE)
00116 return NULL;
00117
00118
00119 (void) strncpy(dem_buf, func_name, func_name_len);
00120 dem_buf[func_name_len] = 0;
00121
00122 return dem_buf;
00123 }
00124
00125
00126
00127
00128
00129
00130
00131 char*
00132 DRA_Demangle_Arglist(const char *mangled_name,
00133 const char dim_order)
00134 {
00135 char *func_name;
00136 char *postfix_sig;
00137 char *arg_list;
00138 char *arg_begin;
00139 char *arg_end;
00140 char *arg_dim;
00141 char *arg_distr;
00142 char *buf;
00143
00144 int arg_pos;
00145 int num_dims;
00146 int dim;
00147 int chunk;
00148
00149
00150 if (dim_order != DRA_DIMS_COLUMNWISE && dim_order != DRA_DIMS_ROWWISE)
00151 return NULL;
00152
00153
00154 if (mangled_name == NULL ||
00155 strncmp(mangled_name, DRA_MANGLE_SIG, DRA_MANGLE_SIG_LEN) != 0)
00156 return NULL;
00157
00158 func_name = (char*) mangled_name + DRA_MANGLE_SIG_LEN;
00159
00160
00161 postfix_sig = strstr(func_name, DRA_MANGLE_SIG);
00162 if (postfix_sig == NULL)
00163 return NULL;
00164
00165
00166 arg_list = postfix_sig + DRA_MANGLE_SIG_LEN;
00167 if (arg_list[0] == 0 || arg_list[1] == 0)
00168 return NULL;
00169
00170 buf = dem_buf;
00171 *buf++ = '(';
00172
00173
00174 for (arg_pos = 0, arg_begin = arg_list; *arg_begin != 0; arg_pos++) {
00175
00176
00177 arg_end = strchr(arg_begin, DRA_ARG_SEPARATOR);
00178 if (arg_end == NULL || arg_end == arg_begin)
00179 return NULL;
00180
00181
00182 if (arg_pos > 0)
00183 *buf++ = ',';
00184
00185
00186 num_dims = (int) strtol(arg_begin, &arg_begin, 10);
00187
00188 if (num_dims > 0) {
00189
00190
00191 if (*arg_begin++ != DRA_NDIMS_END)
00192 return NULL;
00193
00194 *buf++ = '(';
00195
00196
00197 (void) strtol(arg_begin, &arg_begin, 10);
00198
00199
00200 if (*arg_begin++ != DRA_ESIZE_END)
00201 return NULL;
00202
00203
00204 if (dim_order == DRA_DIMS_COLUMNWISE)
00205 arg_dim = arg_end;
00206 else
00207 arg_dim = arg_begin;
00208
00209
00210 for (dim = 0; dim < num_dims; dim++) {
00211
00212 if (dim_order == DRA_DIMS_COLUMNWISE) {
00213 do {
00214 arg_dim--;
00215 } while (*arg_dim != DRA_STAR_CODE &&
00216 *arg_dim != DRA_BLOCK_CODE &&
00217 *arg_dim != DRA_CYCLIC_CODE &&
00218 *arg_dim != DRA_ESIZE_END);
00219 }
00220
00221 arg_distr = arg_dim;
00222
00223 switch(*arg_distr++) {
00224
00225 case DRA_STAR_CODE:
00226 if (buf-dem_buf+strlen(DRA_STAR_STRING)+2 >= DRA_DEM_BUFSIZE)
00227 return NULL;
00228 buf += sprintf(buf, DRA_STAR_STRING);
00229 break;
00230
00231 case DRA_BLOCK_CODE:
00232 if (buf-dem_buf+strlen(DRA_BLOCK_STRING)+2 >= DRA_DEM_BUFSIZE)
00233 return NULL;
00234 buf += sprintf(buf, DRA_BLOCK_STRING);
00235 break;
00236
00237 case DRA_CYCLIC_CODE:
00238 if (buf-dem_buf+strlen(DRA_CYCLIC_STRING)+25 >= DRA_DEM_BUFSIZE)
00239 return NULL;
00240 buf += sprintf(buf, DRA_CYCLIC_STRING);
00241 chunk = (int) strtol(arg_distr, &arg_distr, 10);
00242 if (chunk != 0)
00243 buf += sprintf(buf, "(%d)", chunk);
00244 else
00245 buf += sprintf(buf, "(sym)");
00246 break;
00247
00248 default:
00249 return NULL;
00250 }
00251
00252 if (dim == num_dims-1) {
00253 if (dim_order == DRA_DIMS_ROWWISE && arg_distr != arg_end)
00254 return NULL;
00255 if (dim_order == DRA_DIMS_COLUMNWISE && arg_dim != arg_begin)
00256 return NULL;
00257 *buf++ = ')';
00258 }
00259 else
00260 *buf++ = ',';
00261 }
00262 }
00263
00264
00265 else {
00266 if (buf-dem_buf+2 >= DRA_DEM_BUFSIZE)
00267 return NULL;
00268 *buf++ = '-';
00269
00270
00271 if (*arg_begin != DRA_ARG_SEPARATOR)
00272 return NULL;
00273 }
00274
00275 arg_begin = arg_end+1;
00276 }
00277
00278 *buf++ = ')';
00279 *buf = 0;
00280
00281 return dem_buf;
00282 }
00283
00284
00285
00286
00287
00288
00289
00290 char*
00291 DRA_Demangle(const char *mangled_name,
00292 const char dim_order)
00293 {
00294 char *func_name;
00295 char *postfix_sig;
00296 char *arg_list;
00297 char *arg_begin;
00298 char *arg_end;
00299 char *arg_dim;
00300 char *arg_distr;
00301 char *buf;
00302
00303 int func_name_len;
00304 int arg_pos;
00305 int num_dims;
00306 int dim;
00307 int chunk;
00308
00309
00310
00311 if (dim_order != DRA_DIMS_COLUMNWISE && dim_order != DRA_DIMS_ROWWISE)
00312 return NULL;
00313
00314
00315 if (mangled_name == NULL ||
00316 strncmp(mangled_name, DRA_MANGLE_SIG, DRA_MANGLE_SIG_LEN) != 0)
00317 return NULL;
00318
00319 func_name = (char*) mangled_name + DRA_MANGLE_SIG_LEN;
00320
00321
00322 postfix_sig = strstr(func_name, DRA_MANGLE_SIG);
00323
00324 if (postfix_sig == NULL)
00325 return NULL;
00326
00327
00328 func_name_len = postfix_sig - func_name;
00329 if (func_name_len + 4 >= DRA_DEM_BUFSIZE)
00330 return NULL;
00331
00332
00333 (void) strncpy(dem_buf, func_name, func_name_len);
00334
00335
00336 arg_list = postfix_sig + DRA_MANGLE_SIG_LEN;
00337
00338 if (arg_list[0] == 0 || arg_list[1] == 0)
00339 return NULL;
00340
00341 buf = dem_buf + (postfix_sig-func_name);
00342 *buf++ = '(';
00343
00344
00345 for (arg_pos = 0, arg_begin = arg_list; *arg_begin != 0; arg_pos++) {
00346
00347
00348 arg_end = strchr(arg_begin, DRA_ARG_SEPARATOR);
00349 if (arg_end == NULL || arg_end == arg_begin)
00350 return NULL;
00351
00352
00353 if (arg_pos > 0)
00354 *buf++ = ',';
00355
00356
00357 num_dims = (int) strtol(arg_begin, &arg_begin, 10);
00358
00359 if (num_dims > 0) {
00360
00361
00362 if (*arg_begin++ != DRA_NDIMS_END)
00363 return NULL;
00364
00365 *buf++ = '(';
00366
00367
00368 (void) strtol(arg_begin, &arg_begin, 10);
00369
00370
00371 if (*arg_begin++ != DRA_ESIZE_END)
00372 return NULL;
00373
00374
00375 if (dim_order == DRA_DIMS_COLUMNWISE)
00376 arg_dim = arg_end;
00377 else
00378 arg_dim = arg_begin;
00379
00380
00381 for (dim = 0; dim < num_dims; dim++) {
00382
00383 if (dim_order == DRA_DIMS_COLUMNWISE) {
00384 do {
00385 arg_dim--;
00386 } while (*arg_dim != DRA_STAR_CODE &&
00387 *arg_dim != DRA_BLOCK_CODE &&
00388 *arg_dim != DRA_CYCLIC_CODE &&
00389 *arg_dim != DRA_ESIZE_END);
00390 }
00391
00392 arg_distr = arg_dim;
00393
00394 switch(*arg_distr++) {
00395
00396 case DRA_STAR_CODE:
00397 if (buf-dem_buf+strlen(DRA_STAR_STRING)+2 >= DRA_DEM_BUFSIZE)
00398 return NULL;
00399 buf += sprintf(buf, DRA_STAR_STRING);
00400 break;
00401
00402 case DRA_BLOCK_CODE:
00403 if (buf-dem_buf+strlen(DRA_BLOCK_STRING)+2 >= DRA_DEM_BUFSIZE)
00404 return NULL;
00405 buf += sprintf(buf, DRA_BLOCK_STRING);
00406 break;
00407
00408 case DRA_CYCLIC_CODE:
00409 if (buf-dem_buf+strlen(DRA_CYCLIC_STRING)+25 >= DRA_DEM_BUFSIZE)
00410 return NULL;
00411 buf += sprintf(buf, DRA_CYCLIC_STRING);
00412 chunk = (int) strtol(arg_distr, &arg_distr, 10);
00413 if (chunk != 0)
00414 buf += sprintf(buf, "(%d)", chunk);
00415 else
00416 buf += sprintf(buf, "(sym)");
00417 break;
00418
00419 default:
00420 return NULL;
00421 }
00422
00423 if (dim == num_dims-1) {
00424 if (dim_order == DRA_DIMS_ROWWISE && arg_distr != arg_end)
00425 return NULL;
00426 if (dim_order == DRA_DIMS_COLUMNWISE && arg_dim != arg_begin)
00427 return NULL;
00428 *buf++ = ')';
00429 }
00430 else
00431 *buf++ = ',';
00432 }
00433 }
00434
00435
00436 else {
00437 if (buf-dem_buf+2 >= DRA_DEM_BUFSIZE)
00438 return NULL;
00439
00440 *buf++ = '-';
00441
00442 if (*arg_begin != DRA_ARG_SEPARATOR)
00443 return NULL;
00444 }
00445
00446 arg_begin = arg_end+1;
00447 }
00448
00449 *buf++ = ')';
00450 *buf = 0;
00451
00452 return dem_buf;
00453 }
00454
00455
00456