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

📄 hdrmacro.c

📁 Boost provides free peer-reviewed portable C++ source libraries. We emphasize libraries that work
💻 C
字号:
/* * Copyright 1993, 2000 Christopher Seiwald. * * This file is part of Jam - see jam.c for Copyright information. *//*  This file is ALSO: *  Copyright 2001-2004 David Abrahams. *  Distributed under the Boost Software License, Version 1.0. *  (See accompanying file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt) */# include "jam.h"# include "lists.h"# include "parse.h"# include "compile.h"# include "rules.h"# include "variable.h"# include "regexp.h"# include "hdrmacro.h"# include "hash.h"# include "newstr.h"# include "strings.h"/* * hdrmacro.c - handle header files that define macros used in *              #include statements. * *  we look for lines like "#define MACRO  <....>" or '#define MACRO  "    "' *  in the target file. When found, we  * *  we then phony up a rule invocation like: * *	$(HDRRULE) <target> : <resolved included files> ; * * External routines: *    headers1() - scan a target for "#include MACRO" lines and try *                 to resolve them when needed * * Internal routines: *    headers1() - using regexp, scan a file and build include LIST * * 04/13/94 (seiwald) - added shorthand L0 for null list pointer * 09/10/00 (seiwald) - replaced call to compile_rule with evaluate_rule, *		so that headers() doesn't have to mock up a parse structure *		just to invoke a rule. */static LIST *header_macros1( LIST *l, char *file, int rec, regexp *re[] );/* this type is used to store a dictionary of file header macros */typedef struct header_macro{  char*  symbol;  char*  filename;  /* we could maybe use a LIST here ?? */  } HEADER_MACRO; static struct hash*   header_macros_hash = 0;/* * headers() - scan a target for include files and call HDRRULE */# define MAXINC 10voidmacro_headers( TARGET *t ){    static regexp *re = 0;    FILE	*f;    char	buf[ 1024 ];        if ( DEBUG_HEADER )        printf( "macro header scan for %s\n", t->name );    /* this regexp is used to detect lines of the form       */    /* "#define  MACRO  <....>" or "#define  MACRO  "....."  */    /* in the header macro files..                           */    if ( re == 0 )    {        re = regex_compile(            "^[ 	]*#[ 	]*define[ 	]*([A-Za-z][A-Za-z0-9_]*)[ 	]*"            "[<\"]([^\">]*)[\">].*$" );    }        if( !( f = fopen( t->boundname, "r" ) ) )        return;    while( fgets( buf, sizeof( buf ), f ) )    {        HEADER_MACRO  var, *v = &var;        if ( regexec( re, buf ) && re->startp[1] )        {            /* we detected a line that looks like "#define  MACRO  filename */            re->endp[1][0] = '\0';            re->endp[2][0] = '\0';                    if ( DEBUG_HEADER )                printf( "macro '%s' used to define filename '%s' in '%s'\n",                        re->startp[1], re->startp[2], t->boundname );            /* add macro definition to hash table */            if ( !header_macros_hash )                header_macros_hash = hashinit( sizeof( HEADER_MACRO ), "hdrmacros" );            v->symbol   = re->startp[1];            v->filename = 0;            if ( hashenter( header_macros_hash, (HASHDATA **)&v ) )            {                v->symbol   = newstr( re->startp[1] );  /* never freed */                v->filename = newstr( re->startp[2] );  /* never freed */            }            /* XXXX: FOR NOW, WE IGNORE MULTIPLE MACRO DEFINITIONS !! */            /*       WE MIGHT AS WELL USE A LIST TO STORE THEM..      */        }    }    fclose( f );}char*macro_header_get( const char*  macro_name ){  HEADER_MACRO  var, *v = &var;  v->symbol = (char*)macro_name;  if( header_macros_hash && hashcheck( header_macros_hash, (HASHDATA **)&v ) )  {    if ( DEBUG_HEADER )      printf( "### macro '%s' evaluated to '%s'\n", macro_name, v->filename );    return v->filename;  }  return 0;  }

⌨️ 快捷键说明

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