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

📄 tempnam.c

📁 -
💻 C
字号:
/* * $Id: tempnam.c,v 1.10 1998/09/23 17:14:24 wessels Exp $ *//* A reasonably functional tmpnam. *//* Originally by Tom Hageman, tom@basil.icce.rug.nl *//* * This tmpnam() was changed by Gerben_Wierda@RnA.nl to serve as * tempnam() for squid-1.1.6. It ignores the directory parameter, every * temp file is written in /tmp. */#include "config.h"#if HAVE_LIBC_H#include <libc.h>#endif#if HAVE_STDIO_H#include <stdio.h>#endif#if HAVE_TYPES_H#include <sys/types.h>#endif#if HAVE_LIMITS_H#include <limits.h>#endif#if HAVE_UNISTD_H#include <unistd.h>#endif#undef TMP_MAX#define _tmp		"/tmp/"#define lengthof_tmp	5#ifndef LONG_BIT#define LONG_BIT	(CHAR_BIT * 4)	/* assume sizeof(long) == 4 */#endif#define L_tmpmin	(lengthof_tmp + 5)	/* 5 chars for pid. */#if (L_tmpnam > L_tmpmin)#if (L_tmpnam > L_tmpmin + LONG_BIT / 6)	/* base 64 */#define TMP_MAX	ULONG_MAX#else#define TMP_MAX	((1L << (6 * (L_tmpnam - L_tmpmin))) - 1)#endif#else#ifndef L_tmpnam#error "tmpnam: L_tmpnam undefined"#else#error "tmpnam: L_tmpnam too small"#endif#endifstatic char *_tmpnam(void){    static const char digits[] =#if (L_tmpnam >= L_tmpmin + LONG_BIT / 4)    "0123456789abcdef";#define TMP_BASE	16#else    "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_-";#define TMP_BASE	64#endif    static unsigned long lastcount = 0;    static char buffer[L_tmpnam + 1];    char *s = buffer;    unsigned long count = lastcount;    pid_t pid = getpid();    if (sizeof(_tmp) - 1 != lengthof_tmp)	abort();		/* Consistency error. */    for (;;) {	register int i = L_tmpnam;	register unsigned long c;	register unsigned int p;	/* Build filename. (the hard way) */	s += i;	*s = '\0';	c = (count == TMP_MAX) ? 0 : ++count;	do {	    *--s = digits[c % TMP_BASE];	    c /= TMP_BASE;	} while (--i > L_tmpmin);	p = (unsigned int) pid;	do {	    *--s = digits[p % 10];	    p /= 10;	} while (--i > lengthof_tmp);	do {	    *--s = _tmp[--i];	} while (i > 0);	/* Check that the file doesn't exist. */	if (access(s, 0) != 0)	    break;	/* It exists; retry unless we tried them all. */	if (count == lastcount) {	    s = NULL;	    break;	}    }    lastcount = count;    return s;}char *tempnam(const char *dir, const char *pfx){    return _tmpnam();}#ifdef TESTintmain(){    char *t;    int n = 0;    while ((t = tempnam(NULL, NULL))) {	printf("%s\n", t);	if (++n == 1000)	    break;    }    return 1;}#endif

⌨️ 快捷键说明

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