ivaneeo's blog

自由的力量,自由的生活。

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  669 Posts :: 0 Stories :: 64 Comments :: 0 Trackbacks

#

                        编译器行为测试
测试                说明
AC_C_BIGENDIAN      如果按高字节在前存储字,定义WORDS_BIGENDIAN
AC_C_CONST          如果编译器不完全支持const声明,定义const为空
AC_C_INLINE         如果编译器不支持关键字inline,__inline__或__inline,定义inline为空
AC_C_CHAR_UNSIGNED  如果char是无符号数,定义CHAR_UNSIGNED
AC_C_LONG_DOUBLE    如果主机编译器支持长双精度类型,定义                 HAVE_LONG_DOUBLE
AC_C_CHECK_SIZEOF   把输出变量SIZEOF_UCtype定义为C或C++预定义type类型的大小值(type[, cross-size])
posted @ 2005-08-04 21:20 ivaneeo 阅读(231) | 评论 (0)编辑 收藏

                   系统服务测试
测试                        说明
AC_SYS_INTERPRETER         根据脚本是否以#!/bin/sh为提示符来设置shell变量ac_cv_sys_interpreter为yes或no.
AC_PATH_X                  找到X Window头文件和库文件
所在的路径,并设置shell变量x_includes和x_libraries为适当路径值,如果没有找到路径,则设置no_x
AC_SYS_LONG_FILE_NAMES     如果系统支持长于14个字符的文件名,定义              HAVE_LONG_FILE_NAMES
AC_SYS_RESTARTABLE_SYSCALLS 如果系统调用会重启信号中断,定义              HAVE_RESTARTABLE_SYSCALLS
posted @ 2005-08-04 21:19 ivaneeo 阅读(137) | 评论 (0)编辑 收藏

                       UNIX变体测试宏
测试               说明
AC_AIX             如果宿主系统是AIX,定义_ALL_SOURCE
AC_DYNIX_SEQ       已废弃--用AC_FUNC_GETMNTENT代替
AC_IRIX_SUN        已废弃--用AC_FUNC_GETMNTENT代替
AC_ISC_POSIX       定义_POSIX_SOURCE以允许使用POSIX特性
AC_MINIX           在MINIX系统上定义_MINIX和_POSIX_SOURCE以允许使用POSIX特性
AC_SCO_INTL        已废弃--被AC_FUNC_STRFTIME代替
AC_XENIX_DIR       已废弃--被AC_HEADER_DIRENT代替
posted @ 2005-08-04 21:18 ivaneeo 阅读(186) | 评论 (0)编辑 收藏

AC_TRY_CPP(includes [,action_if_true[,action_if_false]])
这个宏把includes文件名传给预处理程序,如果预处理程序处理成功则执行shell命令action_if_true,反之执行action_if_false.

AC_EGREP_HEADER(pattern,header,action_if_found \ [,action_if_not_found])
这个宏可以用来在头文件header中查找egrep的表达式pattern,如果找到pattern,则执行shell命令action_if_found,反之执行action_if_not_found.

AC_EGREP_CPP(pattern,program,[action_if_found \ [,action_if_not_found]])
用预处理程序对C源代码program进行处理以查找egrep的表达式pattern,如果找到pattern,则执行shell命令action_if_found,反之执行action_if_not_found.

AC_TRY_COMPILE(includes,function_body,[action_if_found \
[,action_if_not_found]])
这个宏查找C或C++编译器的某个语法特性.编译器将编译包含includes中的头文件并使用function_body中定义的函数的测试程序,如果 编译成功,则执行shell命令action_if_found,反之执行action_if_not_found.这个宏不执行链接,可以用 AC_TRY_LINK来测试链接情况.

AC_TRY_LINK(includes,function_body,[,action_if_found \
[,action_if_not_found]])
这个宏在AC_TRY_COMPILE之后增加链接测试.编译器将编译并链接其中包含includes中的头文件并使用function_body中定义 的函数的测试程序,如果链接成功,则执行shell命令action_if_found,反之执行action_if_not_found.

AC_TRY_RUN(program,[action_if_true[,action_if_false \
[,action_if_cross_compiling]]])
这个宏测试宿主系统的运行时行为.编译,链接和执行C程序program,如果program,如果program返回0,则执行shell命令 action_if_true,否则执行action_if_false.如果程序要编译为在另一类型的系统上运行,则用 action_if_cross_compiling代替action_if_found.

AC_CHECK_PROG
测试在当前路径下是否在指定程序program.
AC_CHECK_FUNC
测试指定函数是否在C的链接函数库中存在.
AC_CHECK_HEADER
测试指定头文件是否存在
AC_CHECK_TYPE
如果指定的类型没有被定义,设置一个默认值.
posted @ 2005-08-04 21:18 ivaneeo 阅读(207) | 评论 (0)编辑 收藏

  test -z "$LDFLAGS" && LDFLAGS="-I/usr/include" AC_SUBST(LBFLAGS)
  dnl Tests for UNIX variants
  dnl
  AC_CANONICAL_HOST
  AC_CANONICAL_HOST报告从GNU观点看到的宿主机类型.它输出cpu-company-system形式的系统 名称.例如,笔者的一个系统上,AC_CANONICAL_HOST报告其类型为i686-unknown-linux.
  dnl Tests for programs
  dnl
  AC_PROG_CC
  AC_PROG_LEX
  AC_PROG_AWK
  AC_PROG_YACC
  AC_CHECK_PROG(SHELL,bash,/bin/bash,/bin/sh)
这一代码段按顺序判断并设置了编译器,词法分析器lexer,awk,yacc以及本地shell.
  dnl Tests for libraries
  dnl
  AC_CHECK_LIB(socket, socket)
  AC_CHECK_LIB(resolv,res_init,[echo"res_init() not in libresolv"],
  [echo "res_init() found int libresolv"])
"Test for libraries"的这一代码段展示了怎么为autoconf的宏编写自定义的命令.
  dnl Tests for header files
  dnl
  AC_CHECK_HEADER(killer.h)
  AC_CHECK_HEADERS([resolv.h temio.h curses.h sys/time.h fcntl.h \
  sys/fcntl. memory.h])
  AC_DECL_SYS_SIGLIST
  AC_HEADER_STDC
以"\"结尾的一行说明了多参数续行的正确方式.前面已经介绍过,使用字符"\"告诉m4和shell需要续行,并且用m4的引用符号把整个参数括起来.
  dnl Tests for typedefs
  dnl
  AC_TYPE_GETGROUPS
  AC_TYPE_SIZE_T
  AC_TYPE_PID_T

  dnl Tests for structures
  AC_HEADER_TIME
  AC_STRUCT_TIMEZONE
  dnl Tests of compiler behavior
  dnl
  AC_C_BIGENDIAN
  AC_C_INLINE
  AC_CHECK_SIZEOF(int, 32)
AC_C_BIGENDIAN宏将产生一个警告,因为调用AC_TRY_RUN时没有设置默认值以允许交叉编译,可以忽略这个警告.
  dnl Tests for library functions
  dnl
  AC_FUNC_GETLOADAVG
  AC_FUNC_MMAP
  AC_FUNC_UTIME_NULL
  AC_FUNC_VFORK
  dnl Tests of system services
  dnl
  AC_SYS_INTERPRETER
  AC_PATH_X
  AC_SYS_RESTARTABLE_SYSCALL
AC_SYS_RESTARTABLE_SYSCALLS宏将产生一个警告,因为调用AC_TRY_RUN时没有默认值允许交叉编译,可以忽略这个警告.
  dnl Tests in this section exercise a few of `autoconf' ''s generic macros
  dnl
  dnl First, let's see if we have a usable void pointer type
  dnl
  AC_MSG_CHECKING(for a usable void pointer type)
现在情况开始变得有趣起来.基本上,普通宏允许你通过编写自己的宏对autoconf进行扩展.例如,AC_MSG_CHECKING在屏幕上打印字符串"checking",随后是一个空格以及传入的参数
  AC_TRY_COMPILE( [ ],
      [ char *ptr;
      void *xmalloc();
      ptr = (char *) xmalloc(1);
      ],
      [AC_DEFINE(HAVE_VOID_POINTER) AC_MSG_RESULT(usable void pointer] )
留意AC_TRY_COMPILE宏.autoconf能够把C代码嵌入到一个C程序框架中,并把这个程序写入已生成的configure脚本中,以便在 运行configure时编译这个程序;然后,configure捕获编译器的输出并查找错误.AC_DEFINE (HAVE_VOID_POINTER)产生了一个名为HAVE_VOID_POINTER的预处理器符号(必须将它放置在./acconfig.h中, 因为它并不在其他地方存在).如果编译成功,configure把"#define HAVE_VOID_POINTER 1"写入到config.h中并且在屏幕上打印"usable void pointer";如果编译失败则在config.h中写入"/* #undef HAVE_VOID_POINTER */,并显示"no usable void pointer".在你自己的源代码文件中,只需按如下的方式测试这个预处理符号:
  #ifdef HAVE_VOID_POINTER
  /* do something */
  #else
  /* do something else */
  #endif
  dnl Now, let's exercises the preprocessor
  dnl
  AC_TRY_CPP(math.h, echo 'found math.h', echo 'no math.h - deep doo doo!)
如果configure找到了头文件math.h,它会在屏幕上显示"found math.h";否则它通知用户出现了一个问题.
  dnl Next, we test the linker
  dnl
  AC_TRY_LINK([#ifndef HAVE_UNISTD_H
  #include <signal.h>
  #endif],
  [char *ret = *(sys_siglist + 1);],
  [AC_DEFINE(HAVE_SYS_SIGLIST), AC_MSG_RESULT(got sys_siglist)],
  [AC_MSG_RESULT(no sys_siglist)])
这一段代码测试连接器.同样,因为HAVE_SYS_SIGLIST不是一个标准预处理器符合,你必须在./acconfig.h中声明它.
  dnl Finally, set a default value for a ridiculous type
  dnl
  AC_CHECK_TYPE(short_short_t, unsigned short)
最后的测试只检查一种(希望的)不存在C数据类型.如果确实没有,则将short_short_t定义为unsigned short.读者可以到config.h中查找与short_short_t相关的#define指令来确认这个测试的结果.
posted @ 2005-08-04 21:17 ivaneeo 阅读(561) | 评论 (0)编辑 收藏

  dnl Autoconfigure script for bogusapp
  dnl Kurt Wall <kwall@kurtwerks.com>
  dnl
  dnl Process this file with 'autoconf' to produce a 'configure' script
第一个代码段是标准的autoconfig.in文件头,指出了这个configure.in脚本隶属于什么软件包,联系信息(通常是软件包的维护者)以及重新生成配置脚本的说明.
AC_INIT(bogusapp.c)
AC_CONFIG_HEADER(config.h)
接下来的两行调用了前面介绍过的AC_INIT函数,并且在源文件树的根目录下创建了一个名为config.in的头文件,其中只包含从实际的头文件中提 取的预处理符号.主要在源代码中包含这个头文件并使用其中的相关符合,实际的程序就能在每个可能的系统上平滑无缝地编译.autoconf根据名为 config.h.in中包含了程序需要的所有#define指令.

怎么创建config.h.in?幸运的是,autoconf自带了一个名为autoheader的shell脚本,这个脚本使用起来很方便.该脚本能生 成config.h.in.autoheader通过读入configure.in,作为autoconf软件一部分的acconfig.h文件和位于源 代码树根路径下用于保存预处理符号的acconfig.h文件,生成config.h.in文件.在你开始抱怨又要创建另一个文件之前,告诉你一个好消 息,./acconfig.h只需包含在别处没有定义的预处理符号.更好地是,这些符号值都能为空.这个文件中只需包含可以被autoconf和 autoheader读取和使用的合法定义的C风格预处理符号.要创建config.h.in,在创建了你的config.in,在创建了你的 config.in文件之后在源代码目录下执行autoheader.下面的代码段是用于bogusapp的acconfig.h文件.
/* Define this 1 if you compiler allows a (void *) function return */
#define HAVE_VOID_POINTER 0

/* Define this 1 if your C compiler has a short_short_t type */
#define short_short_t 0

/* Define this 1 if your signal handling library support sys_siglist */
#define HAVE_SYS_SIGLIST 0
posted @ 2005-08-04 21:16 ivaneeo 阅读(386) | 评论 (0)编辑 收藏

Class.forName(props.getProperty("driver"));
String url = props.getProperty("url");
Connection con = DriverManager.getConnection(url, props);
//        showWarnings(con.getWarnings());
initLanguage(con);
return con;

上面的Connection类的方法getWarnings检索调用这个Connection对象的第一个警告.如果有多个可以用getNextWarning方法得到.

public void showWarnings(SQLWarning w) {
  while (w != null) {
    System.out.println(w.getMessage());
    w = w.getNextWarning();
  }
}

private void initLanguage(Connection con) throws SQLException {
Statement stmt = con.createStatement();

stmt.executeUpdate("set LANGUAGE 'us_english'");
stmt.close();
}
上面函数显示了一个比较简单的调用语句的方法.

这里是使用的属性文件注册.属性文件如下:
--------------------------------------------------------------------
#属性文件connection.properties.tmpl
#
# The URL of the server to which you want to connect
#
driver=net.sourceforge.jtds.jdbc.Driver
url=jdbc:jtds:sqlserver://localhost/dbname
USER=XXXX
PASSWORD=YYYY
SERVERNAME=localhost
PORTNUMBER=1433
DATABASENAME=dbname
XAEMULATION=true

#
# TDS Version
#

#
# Use this for MS SQL Server 6.5+
#
#TDS=4.2

#
# Use this for Sybase 10+
#
#TDS=5.0

#
# Use this for MS SQL Server 7.0+
#
#TDS=7.0

#
# Use this for MS SQL Server 2000 (default)
#
TDS=8.0
--------------------------------------------------------------------

读入属性文件如下:
String CONNECTION_PROPERTIES = "conf/connection.properties";
File propFile = new File(fileName);
if (!propFile.exists()) {
  fail("Connection properties not found (" + propFile + ").");
}
try {
Properties props = new Properties();
props.load(new FileInputStream(propFile));
return props;
}
catch (IOException e) {
throw new RuntimeException(e.getMessage());
}
这里是fail函数是使用了junit的fail方法,表示测试失败.
posted @ 2005-08-04 21:13 ivaneeo 阅读(615) | 评论 (0)编辑 收藏

private void disconnect() throws Exception {
  if (con != null) {
  con.close();
  con = null;
  }
}

protected void connect() throws Exception {
disconnect();
con = getConnection();
}

上面是一般写法.
    public Connection getConnection() throws Exception {
        Class.forName(props.getProperty("driver"));
        String url = props.getProperty("url");
        Connection con = DriverManager.getConnection(url, props);
//        showWarnings(con.getWarnings());
        initLanguage(con);

        return con;
    }
posted @ 2005-08-04 21:12 ivaneeo 阅读(175) | 评论 (0)编辑 收藏

diff命令比较两个不同的文件或不同目录下的两个同名文件.在使用diff时,可以用选项来定制输出格式.patch程序将读取diff的输出和所比较 文件中的一个来重新生成另一个.diff手册的作者写道:"如果你认为diff是通过从一个文件中减去另一个来生成这两个文件的差别文件,那就可以认为 patch是使用这个差别文件和其中的一个源文件来生成另一个源文件".
  diff命令的一般语法为:
    diff [option] srcfile dstfile
  diff在运行时试图找到在srcfile和dstfile里都一样的很多连续行,在碰到srcfile和dstfile里不一样的行时运行被打打断,这些有差别的行称为块(hunk).

                       diff的命令行选项合参数
选项       描述
-a         将所有的文件看作文本,既使文件看起来像是二进制的也不例外,并且进行逐行比较
-b         忽略块中空白数目的改变
-B         忽略插入或删除空行造成的改变
-c         产生"上下文"(context)格式的输出
-C[num]    产生"上下文"(context)格式的输出,显示块前后num行的内容,如果不指定num的值,则显示块前后3行的内容
-H         修改diff处理大文件的方式
-i         忽略大小写,同样对待大写和小写字母
-I regexp  忽略插入或删除与正则表达式regexp匹配的行
-l         将输出结果通过pr命令处理加上页码
-p         显示出现块的C函数
-q         只报告文件是否不同;不输出差别
-r         比较目录时,进行递归比较
-s         报告两个文件相同(默认的行为是不报告相同的文件)
-t         输出时tab扩展为空白
-u         产生"统一"(unified)格式的输出
-U[num]    产生"统一"(unified)格式的输出,显示块前后num行的内容,如果不指定num的值,则显示块前后3行的内容
-v         打印diff的版本号
-w         逐行比较时忽略空白
-W cols    如果产生并排格式的输出(参见-y) ,让输出的每一列有cols个字符宽
-x pattern 当比较目录时,忽略匹配模式pattern的任何文件和子目录
-y         产生并排格式的输出
posted @ 2005-08-04 21:10 ivaneeo 阅读(1758) | 评论 (0)编辑 收藏

hello.c
#include <stdio.h>
int main(void)
{
  char msg[ ] = "Hello Linux programmer!";
  puts(msg);
  printf("Here you are, using diff.\n");

  return 0;
}

howdy.c
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
  char msg[ ] = "Hello, linux programmer, from howdy.c";
  puts(msg);
  printf("howdy.c says, 'Here you are using diff.'\n");
  exit(EXIT_SUCCESS);
}
使用diff的基本语法产生的输出(在下面"理解正规输出格式"部分所介绍的为正规格式)是:
$diff hello.c howdy.c
la2
> #include <stdlib.h>
5c6
<   char msg[ ] = "Hello, Linux programmer!";
---
>   char msg[ ] = "Hello, Linux programmer, from howdy.c!";
8c9
<   printf("Here you are, using diff.\n");
---
>   printf("howdy.c says, 'Here you are, using diff.'\n");
10c11
<   return 0;
---
>   exit(EXIT_SUCCESS);
diff能够产生几种输出格式,包括正规(normal,也是diff默认的市场格式),上下文(context),统一(unified)以及并排(side-by-side)4种.
posted @ 2005-08-04 17:23 ivaneeo 阅读(136) | 评论 (0)编辑 收藏

仅列出标题
共67页: First 上一页 59 60 61 62 63 64 65 66 67 下一页