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

📄 misc.c

📁 关系型数据库 Postgresql 6.5.2
💻 C
字号:
/* Module:          misc.c * * Description:     This module contains miscellaneous routines *                  such as for debugging/logging and string functions. * * Classes:         n/a * * API functions:   none * * Comments:        See "notice.txt" for copyright and license information. * */#include <stdio.h>#include <varargs.h>#include <string.h>#include "psqlodbc.h"#ifndef WIN32#if HAVE_PWD_H#include <pwd.h>#endif#include <sys/types.h>#include <unistd.h>#else#include <process.h>	/* Byron: is this where Windows keeps def. of getpid ? */#endifextern GLOBAL_VALUES globals;void generate_filename(char*,char*,char*);voidgenerate_filename(char* dirname,char* prefix,char* filename){	int pid = 0;#ifndef WIN32	struct passwd *ptr = 0;	ptr = getpwuid(getuid());#endif	pid = getpid();	if(dirname == 0 || filename == 0)		return;	strcpy(filename,dirname);	strcat(filename,DIRSEPARATOR);	if(prefix != 0)		strcat(filename,prefix);#ifndef WIN32	strcat(filename,ptr->pw_name);#endif	sprintf(filename,"%s%u%s",filename,pid,".log");	return;}#ifdef MY_LOGvoidmylog(va_alist)va_dcl{char *fmt;char *args;char filebuf[80];	FILE* LOGFP = globals.mylogFP;	if ( globals.debug) {		va_start(args);		fmt = va_arg(args, char *);		if (! LOGFP) {			generate_filename(MYLOGDIR,MYLOGFILE,filebuf);#ifndef __CYGWIN32__			LOGFP = fopen(filebuf, "w");#else			LOGFP = fopen(filebuf, "wb");#endif			globals.mylogFP = LOGFP;			setbuf(LOGFP, NULL);		}		if (LOGFP)			vfprintf(LOGFP, fmt, args);		va_end(args);	}}#endif#ifdef Q_LOGvoid qlog(va_alist)va_dcl{char *fmt;char *args;char filebuf[80];FILE* LOGFP = globals.qlogFP;	if ( globals.commlog) {		va_start(args);		fmt = va_arg(args, char *);		if (! LOGFP) {			generate_filename(QLOGDIR,QLOGFILE,filebuf);#ifndef __CYGWIN32__			LOGFP = fopen(filebuf, "w");#else			LOGFP = fopen(filebuf, "wb");#endif			globals.qlogFP = LOGFP;			setbuf(LOGFP, NULL);		}		if (LOGFP)			vfprintf(LOGFP, fmt, args);		va_end(args);	}}#endif/*  Undefine these because windows.h will redefine and cause a warning */#ifdef HAVE_CONFIG_H#include "config.h"#endif#ifdef WIN32#undef va_start#undef va_end#endif#ifndef WIN32#include "iodbc.h"#include "isql.h"#else#include <windows.h>#include <sql.h>#endif /*	returns STRCPY_FAIL, STRCPY_TRUNCATED, or #bytes copied (not including null term) */int my_strcpy(char *dst, int dst_len, char *src, int src_len){	if (dst_len <= 0)		return STRCPY_FAIL;	if (src_len == SQL_NULL_DATA) {		dst[0] = '\0';		return STRCPY_NULL;		}	else if (src_len == SQL_NTS)		src_len = strlen(src);	if (src_len <= 0)		return STRCPY_FAIL;	else {			if (src_len < dst_len) {			memcpy(dst, src, src_len);			dst[src_len] = '\0';		}		else { 			memcpy(dst, src, dst_len-1);			dst[dst_len-1] = '\0';	/* truncated */			return STRCPY_TRUNCATED;		}	}	return strlen(dst);}// strncpy copies up to len characters, and doesn't terminate// the destination string if src has len characters or more.// instead, I want it to copy up to len-1 characters and always// terminate the destination string.char *strncpy_null(char *dst, const char *src, int len){int i;	if (NULL != dst) {		/*  Just in case, check for special lengths */		if (len == SQL_NULL_DATA) {			dst[0] = '\0';			return NULL;		}			else if (len == SQL_NTS)			len = strlen(src) + 1;		for(i = 0; src[i] && i < len - 1; i++) {			dst[i] = src[i];		}		if(len > 0) {			dst[i] = '\0';		}	}	return dst;}//	Create a null terminated string (handling the SQL_NTS thing)://		1. If buf is supplied, place the string in there (assumes enough space) and return buf.//		2. If buf is not supplied, malloc space and return this stringchar *make_string(char *s, int len, char *buf){int length;char *str;    if(s && (len > 0 || (len == SQL_NTS && strlen(s) > 0))) {		length = (len > 0) ? len : strlen(s);		if (buf) {			strncpy_null(buf, s, length+1);			return buf;		}        str = malloc(length + 1);		if ( ! str)			return NULL;        strncpy_null(str, s, length+1);		return str;	}	return NULL;}//	Concatenate a single formatted argument to a given buffer handling the SQL_NTS thing.//	"fmt" must contain somewhere in it the single form '%.*s'//	This is heavily used in creating queries for info routines (SQLTables, SQLColumns).//	This routine could be modified to use vsprintf() to handle multiple arguments.char *my_strcat(char *buf, char *fmt, char *s, int len){    if (s && (len > 0 || (len == SQL_NTS && strlen(s) > 0))) {		int length = (len > 0) ? len : strlen(s);		int pos = strlen(buf);		sprintf(&buf[pos], fmt, length, s);		return buf;	}	return NULL;}void remove_newlines(char *string){    unsigned int i;    for(i=0; i < strlen(string); i++) {        if((string[i] == '\n') ||           (string[i] == '\r')) {            string[i] = ' ';        }    }}char *trim(char *s){	int i;	for (i = strlen(s) - 1; i >= 0; i--) {		if (s[i] == ' ')			s[i] = '\0';		else			break;	}	return s;}

⌨️ 快捷键说明

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