⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 aplibtool.c

📁 linux subdivision ying gai ke yi le ba
💻 C
📖 第 1 页 / 共 2 页
字号:
void post_parse_fixup(cmd_data_t *cmd_data){    int a;    char *arg;    char *ext;    if (cmd_data->output_type == otStaticLibrary && cmd_data->mode == mLink) {        /* We do a real hatchet job on the args when making a static library         * removing all compiler switches & any other cruft that ar won't like         * We also need to explode any libraries listed         */        for (a=0; a < cmd_data->num_args; a++) {            arg = cmd_data->arglist[a];            if (arg) {                ext = strrchr(arg, '.');                if (ext) {                    ext++;                }                if (arg[0] == '-') {                    cmd_data->arglist[a] = NULL;                    if (strcmp(arg, "-rpath") == 0 && a+1 < cmd_data->num_args) {                        cmd_data->arglist[a+1] = NULL;                    }                    if (strcmp(arg, "-R") == 0 && a+1 < cmd_data->num_args) {                        cmd_data->arglist[a+1] = NULL;                    }                    if (strcmp(arg, "-version-info") == 0 && a+1 < cmd_data->num_args) {                        cmd_data->arglist[a+1] = NULL;                    }                    if (strcmp(arg, "-Zstack") == 0 && a+1 < cmd_data->num_args) {                        cmd_data->arglist[a+1] = NULL;                    }                    if (strcmp(arg, "-o") == 0) {                        a++;                    }                }                if (strcmp(arg, CC) == 0 || strcmp(arg, CC EXE_EXT) == 0) {                    cmd_data->arglist[a] = LIBRARIAN " cr";                }                if (ext) {                    if (strcmp(ext, "h") == 0 || strcmp(ext, "c") == 0) {                        /* ignore source files, they don't belong in a library */                        cmd_data->arglist[a] = NULL;                    }                    if (strcmp(ext, STATIC_LIB_EXT) == 0) {                        cmd_data->arglist[a] = NULL;                        explode_static_lib(arg, cmd_data);                    }                }            }        }    }    if (cmd_data->output_type == otDynamicLibrary) {        for (a=0; a < cmd_data->num_args; a++) {            arg = cmd_data->arglist[a];            if (arg) {                if (strcmp(arg, "-rpath") == 0 && a+1 < cmd_data->num_args) {                    cmd_data->arglist[a] = NULL;                    cmd_data->arglist[a+1] = NULL;                }            }        }        if (export_all) {            generate_def_file(cmd_data);        }    }#if USE_OMF    if (cmd_data->output_type == otObject ||        cmd_data->output_type == otProgram ||        cmd_data->output_type == otDynamicLibrary) {        cmd_data->arglist[cmd_data->num_args++] = "-Zomf";    }#endif    if (shared && (cmd_data->output_type == otObject || cmd_data->output_type == otDynamicLibrary)) {        cmd_data->arglist[cmd_data->num_args++] = SHARE_SW;    }}int execute_command(cmd_data_t *cmd_data){    int target = 0;    char *command;    int a, total_len = 0;    char *args[4];    for (a=0; a < cmd_data->num_args; a++) {        if (cmd_data->arglist[a]) {            total_len += strlen(cmd_data->arglist[a]) + 1;        }    }    command = (char *)malloc( total_len );    command[0] = 0;    for (a=0; a < cmd_data->num_args; a++) {        if (cmd_data->arglist[a]) {            strcat(command, cmd_data->arglist[a]);            strcat(command, " ");        }    }    command[strlen(command)-1] = 0;    if (!silent) {        puts(command);    }    cmd_data->num_args = target;    cmd_data->arglist[cmd_data->num_args] = NULL;    command = shell_esc(command);    args[0] = SHELL_CMD;    args[1] = "-c";    args[2] = command;    args[3] = NULL;    return spawnvp(P_WAIT, args[0], args);}char *shell_esc(const char *str){    char *cmd;    unsigned char *d;    const unsigned char *s;    cmd = (char *)malloc(2 * strlen(str) + 1);    d = (unsigned char *)cmd;    s = (const unsigned char *)str;    for (; *s; ++s) {        if (*s == '"' || *s == '\\') {	    *d++ = '\\';	}	*d++ = *s;    }    *d = '\0';    return cmd;}bool explode_static_lib(char *lib, cmd_data_t *cmd_data){    char tmpdir[1024];    char savewd[1024];    char cmd[1024];    char *name;    DIR *dir;    struct dirent *entry;    strcpy(tmpdir, lib);    strcat(tmpdir, ".exploded");    mkdir(tmpdir, 0);    cmd_data->tmp_dirs[cmd_data->num_tmp_dirs++] = strdup(tmpdir);    getcwd(savewd, sizeof(savewd));    if (chdir(tmpdir) != 0)        return false;    strcpy(cmd, LIBRARIAN " x ");    name = strrchr(lib, '/');    if (name) {        name++;    } else {        name = lib;    }    strcat(cmd, "../");    strcat(cmd, name);    system(cmd);    chdir(savewd);    dir = opendir(tmpdir);    while ((entry = readdir(dir)) != NULL) {        if (entry->d_name[0] != '.') {            strcpy(cmd, tmpdir);            strcat(cmd, "/");            strcat(cmd, entry->d_name);            cmd_data->arglist[cmd_data->num_args++] = strdup(cmd);        }    }    closedir(dir);    return true;}void cleanup_tmp_dir(char *dirname){    DIR *dir;    struct dirent *entry;    char fullname[1024];    dir = opendir(dirname);    if (dir == NULL)        return;    while ((entry = readdir(dir)) != NULL) {        if (entry->d_name[0] != '.') {            strcpy(fullname, dirname);            strcat(fullname, "/");            strcat(fullname, entry->d_name);            remove(fullname);        }    }    rmdir(dirname);}void cleanup_tmp_dirs(cmd_data_t *cmd_data){    int d;    for (d=0; d < cmd_data->num_tmp_dirs; d++) {        cleanup_tmp_dir(cmd_data->tmp_dirs[d]);    }}void generate_def_file(cmd_data_t *cmd_data){    char def_file[1024];    char implib_file[1024];    char *ext;    FILE *hDef;    char *export_args[1024];    int num_export_args = 0;    char *cmd;    int cmd_size = 0;    int a;    if (cmd_data->output_name) {        strcpy(def_file, cmd_data->output_name);        strcat(def_file, ".def");        hDef = fopen(def_file, "w");        if (hDef != NULL) {            fprintf(hDef, "LIBRARY '%s' INITINSTANCE\n", nameof(cmd_data->output_name));            fprintf(hDef, "DATA NONSHARED\n");            fprintf(hDef, "EXPORTS\n");            fclose(hDef);            for (a=0; a < cmd_data->num_obj_files; a++) {                cmd_size += strlen(cmd_data->obj_files[a]) + 1;            }            cmd_size += strlen(GEN_EXPORTS) + strlen(def_file) + 3;            cmd = (char *)malloc(cmd_size);            strcpy(cmd, GEN_EXPORTS);            for (a=0; a < cmd_data->num_obj_files; a++) {                strcat(cmd, " ");                strcat(cmd, cmd_data->obj_files[a] );            }            strcat(cmd, ">>");            strcat(cmd, def_file);            puts(cmd);            export_args[num_export_args++] = SHELL_CMD;            export_args[num_export_args++] = "-c";            export_args[num_export_args++] = cmd;            export_args[num_export_args++] = NULL;            spawnvp(P_WAIT, export_args[0], export_args);            cmd_data->arglist[cmd_data->num_args++] = strdup(def_file);            /* Now make an import library for the dll */            num_export_args = 0;            export_args[num_export_args++] = DEF2IMPLIB_CMD;            export_args[num_export_args++] = "-o";            strcpy(implib_file, ".libs/");            strcat(implib_file, cmd_data->stub_name);            ext = strrchr(implib_file, '.');            if (ext)                *ext = 0;            strcat(implib_file, ".");            strcat(implib_file, STATIC_LIB_EXT);            export_args[num_export_args++] = implib_file;            export_args[num_export_args++] = def_file;            export_args[num_export_args++] = NULL;            spawnvp(P_WAIT, export_args[0], export_args);        }    }}/* returns just a file's name without path or extension */char *nameof(char *fullpath){    char buffer[1024];    char *ext;    char *name = strrchr(fullpath, '/');    if (name == NULL) {        name = strrchr(fullpath, '\\');    }    if (name == NULL) {        name = fullpath;    } else {        name++;    }    strcpy(buffer, name);    ext = strrchr(buffer, '.');    if (ext) {        *ext = 0;        return strdup(buffer);    }    return name;}char *truncate_dll_name(char *path){    /* Cut DLL name down to 8 characters after removing any mod_ prefix */    char *tmppath = strdup(path);    char *newname = strrchr(tmppath, '/') + 1;    char *ext = strrchr(tmppath, '.');    int len;    if (ext == NULL)        return tmppath;    len = ext - newname;    if (strncmp(newname, "mod_", 4) == 0) {        strcpy(newname, newname + 4);        len -= 4;    }    if (len > 8) {        strcpy(newname + 8, strchr(newname, '.'));    }    return tmppath;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -