📄 emit.c
字号:
/*Copyright (c) 2000, Red Hat, Inc.This file is part of Source-Navigator.Source-Navigator is free software; you can redistribute it and/ormodify it under the terms of the GNU General Public License as publishedby the Free Software Foundation; either version 2, or (at your option)any later version.Source-Navigator is distributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the implied warranty ofMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNUGeneral Public License for more details.You should have received a copy of the GNU General Public License alongwith Source-Navigator; see the file COPYING. If not, write tothe Free Software Foundation, 59 Temple Place - Suite 330, Boston,MA 02111-1307, USA.*//* * emit.c * * Copyright (C) 1998 Cygnus Solutions * * Description: * Handler functions for treating interesting things we encounter in CHILL source code. */#include <stdlib.h>#include <sys/param.h>#include <sys/stat.h>#include "common.h"#include "stack.h"#include "symtab.h"#include "snptools.h"/* Are we in local declaration space? */int local = 0;intemit_module(struct identifier * id, struct blockregion block){#ifdef DEBUG printf("emit_module: %s (%d,%d) to (%d,%d)\n", (id == NULL) ? "anonymous" : id->name, block.startline, block.startcol, block.endline, block.endcol);#endif if (id == NULL) return sn_insert_symbol(SN_CLASS_DEF, NULL, "anonymous", sn_current_file(), block.startline, block.startcol, block.endline, block.endcol, 0L, NULL, NULL, NULL, NULL, 0, 0, 0, 0); else return sn_insert_symbol(SN_CLASS_DEF, NULL, id->name, sn_current_file(), id->line, id->startcol, block.endline, block.endcol, 0L, NULL, NULL, NULL, NULL, id->line, id->startcol, id->line, id->endcol);}intemit_spec_module(struct identifier * id, struct blockregion block){ return emit_module(id, block);}intemit_procedure(struct identifier * id, struct sig signature){#ifdef DEBUG printf("emit_procedure: %s (%d,%d) to (%ld,%ld)\n", id->name, id->line, id->startcol, sn_line(), sn_column());#endif sn_insert_symbol(SN_MBR_FUNC_DCL, get_module_name(), id->name, sn_current_file(), id->line, id->startcol, sn_line(), sn_column(), SN_PRIVATE, signature.rettype, signature.args, NULL, NULL, id->line, id->startcol, id->line, id->endcol); return sn_insert_symbol(SN_MBR_FUNC_DEF, get_module_name(), id->name, sn_current_file(), id->line, id->startcol, sn_line(), sn_column(), SN_PRIVATE, signature.rettype, signature.args, NULL, NULL, id->line, id->startcol, id->line, id->endcol);}intemit_process(struct identifier * id, struct sig signature){ return emit_procedure(id, signature);}intemit_synonyms(struct identifierlist * idlist, char * type){ /* Treat these as constants. */ while (idlist != NULL) {#ifdef DEBUG printf("emit_synonyms: %s %s\n", idlist->name, type);#endif sn_insert_symbol(SN_CONS_DEF, get_module_name(), idlist->name, sn_current_file(), idlist->line, idlist->startcol, idlist->line, idlist->endcol, 0L, type, NULL, NULL, NULL, idlist->line, idlist->startcol, idlist->line, idlist->endcol); idlist = idlist->next; } return 0;}intemit_type_synonyms(struct identifierlist * idlist, char * type){ /* Treat these as typedefs. */ while (idlist != NULL) {#ifdef DEBUG printf("emit_mode_synonyms: %s %s\n", idlist->name, type);#endif sn_insert_symbol(SN_TYPE_DEF, get_module_name(), idlist->name, sn_current_file(), idlist->line, idlist->startcol, idlist->line, idlist->endcol, 0L, type, NULL, NULL, NULL, idlist->line, idlist->startcol, idlist->line, idlist->endcol); idlist = idlist->next; } return 0;}intemit_structure(struct identifierlist * idlist, char * type){ /* Treat these as classes (as we have to with C and other languages). */ while (idlist != NULL) {#ifdef DEBUG printf("emit_structure: %s %s\n", idlist->name, type);#endif /* Treat these as class member variables. */ sn_insert_symbol(SN_CLASS_DEF, get_module_name(), idlist->name, sn_current_file(), sn_line(), sn_column(), sn_line(), sn_column(), 0L, type, NULL, NULL, NULL, sn_line(), sn_column(), sn_line(), sn_column()); idlist = idlist->next; } return 0;} intemit_declarations(struct identifierlist * idlist, char * type){ /* Treat these as class member variables. */ while (idlist != NULL) {#ifdef DEBUG printf("emit_decl: %s %s\n", idlist->name, type);#endif sn_insert_symbol(SN_MBR_VAR_DEF, get_module_name(), idlist->name, sn_current_file(), idlist->line, idlist->startcol, idlist->line, idlist->endcol, SN_PRIVATE | SN_STATIC, type, NULL, NULL, NULL, idlist->line, idlist->startcol, idlist->line, idlist->endcol); idlist = idlist->next; } return 0;}intemit_enumeration_values(struct identifierlist * idlist){ while (idlist != NULL) {#ifdef DEBUG printf("emit_enum_val: %s\n", idlist->name);#endif sn_insert_symbol(SN_ENUM_CONST_DEF, get_module_name(), idlist->name, sn_current_file(), idlist->line, idlist->startcol, idlist->line, idlist->endcol, 0L, NULL, NULL, NULL, NULL, idlist->line, idlist->startcol, idlist->line, idlist->endcol); idlist = idlist->next; } return 0;}/* Sets in CHILL are tagless (unlike C enums). */intemit_enumeration(){ return sn_insert_symbol(SN_ENUM_DEF, get_module_name(), "anonymous", sn_current_file(), sn_line(), sn_column(), sn_line(), sn_column(), 0L, NULL, NULL, NULL, NULL, sn_line(), sn_column(), sn_line(), sn_column());}intemit_include(char * filename, unsigned startline, unsigned startcolumn, unsigned endline, unsigned endcolumn){ char absfilename[MAXPATHLEN];#ifdef DEBUG printf("emit_include: %s\n", filename);#endif if (sn_find_file(filename, absfilename) == 0) { return sn_insert_symbol(SN_INCLUDE_DEF, NULL, absfilename, sn_current_file(), sn_line(), sn_column(), sn_line(), sn_column(), 0, NULL, NULL, NULL, NULL, sn_line(), sn_column(), sn_line(), sn_column()); } return 1;}intemit_xref_assignment(struct identifierlist * idlist){ char * varname; int scope; while (idlist != NULL) { scope = SN_REF_SCOPE_GLOBAL; varname = idlist->name; if (with_active()) { varname = get_with_scope(); }#ifdef DEBUG printf("emit_xref_assignment, argv=[%s,%d]\n", varname, idlist->line);#endif if (find_symbol(varname)) { if ((int) sn_getopt(SN_OPT_LOCAL_VARS) == 0) { /* No cross-referencing of this local variable required. */#ifdef DEBUG printf("emit_xref_assignment: no xref of last mentioned var!\n");#endif return 0; } else { scope = SN_REF_SCOPE_LOCAL; } } sn_insert_xref(SN_REF_TO_MBR_VAR, SN_MBR_FUNC_DEF, scope, get_module_name(), get_proc_name(), NULL, get_module_name(), varname, NULL, sn_current_file(), idlist->line, SN_REF_WRITE); idlist = idlist->next; } return 0;}intemit_xref_procedure(char * procname, unsigned lineno){ assert(procname != NULL);#ifdef DEBUG printf("emit_xref_procedure from %s::%s to %s::%s\n", get_module_name(), get_proc_name(), get_module_name(), procname);#endif return sn_insert_xref(SN_REF_TO_MBR_FUNC, SN_MBR_FUNC_DEF, SN_REF_SCOPE_GLOBAL, get_module_name(), get_proc_name(), NULL, get_module_name(), procname, NULL, sn_current_file(), lineno, SN_REF_PASS);}intemit_xref_variable(char * varname, unsigned lineno){ int scope = SN_REF_SCOPE_GLOBAL; assert(varname != NULL);#ifdef DEBUG printf("emit_xref_variable from %s::%s to %s\n", get_module_name(), get_proc_name(), varname);#endif if (find_symbol(varname)) { if ((int) sn_getopt(SN_OPT_LOCAL_VARS) == 0) { /* No cross-referencing of this local variable is required. */#ifdef DEBUG printf("emit_xref_variable: no xref of last mentioned var!\n");#endif return 0; } else { scope = SN_REF_SCOPE_LOCAL; } } return sn_insert_xref(SN_REF_TO_MBR_VAR, SN_MBR_FUNC_DEF, scope, get_module_name(), get_proc_name(), NULL, get_module_name(), varname, NULL, sn_current_file(), lineno, SN_REF_READ);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -