This is aux.c in view mode; [Download] [Up]
/*
* some useful definitions for memory allocation and string
* handling
*/
#define MODNAME "aux"
#include "aux.h"
#include <sys/time.h>
#include <sys/times.h>
#include <sys/param.h>
#ifdef IRIS
#include <task.h> /* for getpid */
#endif
#if PARIX
char *rindex(char *s, char c)
{
char *p, *pi;
for(pi=NULL, p=s; *p; p++) if (*p==c) pi=p;
return pi;
}
#endif
#ifdef CM5
#include <cm/cmmd.h> /* for timer functions */
#endif
int list_mem;
int mem_size;
int mem_s=0, mem_pl=0, mem_grid=0, mem_bo=0, mem_nb=0;
int memsize()
{
return 0;
}
char *checkalloc(p, len, deflen)
char *p;
int len, deflen;
{
if (p==NULL) {
p = malloc(deflen);
if (p==NULL) {
fprintf(stderr,"Could not allocate memory.\n");
exit(1);
}
}
if (len<=deflen) return p;
p = (char*)realloc(p,len);
if (p==NULL) {
fprintf(stderr,"Could not extend memory.\n");
exit(1);
}
return p;
}
char *copy(str)
char *str;
{
char *string;
int l;
if (str==NULL) return NULL;
l = strlen(str)+1;
string = (char *)malloc(l);
if (string==NULL) {
fprintf(stderr,"Could not string string.\n");
exit(1);
}
strcpy(string, str);
return(string);
}
char aux_buf[aux_bufsiz], aux_buf2[aux_bufsiz], *aux_bufp;
char *substr(const char *str, int ofs, int len)
{
char *s;
aux_bufnstring(s, len+1);
bcopy(str+ofs, s, len);
s[ofs+len] = '\0';
return s;
}
char *stringf(char *format, ...)
{
char *p;
aux_sprintf(p, format);
return(p);
}
char *copydata(str, len)
char *str;
int len;
{
register char *s,*p;
if (str==NULL) return NULL;
s = (char *)malloc(len);
if (s==NULL) {
fprintf(stderr,"Could not allocate string.\n");
exit(1);
}
p=s; s+=len;
while (p<s) *(p++)=(*(str++));
return(s-len);
}
char *append(s1, s2)
char *s1, *s2;
{
register char *s;
s = (char*)realloc(s1,strlen(s1)+strlen(s2)+1);
return strcat(s,s2);
}
FILE *ropen(fn)
char *fn;
{
FILE *fd;
if (strcmp(fn,"-")==0) fd=fdopen(0,"r"); else fd=fopen(fn,"r");
if (fd==NULL) {
fprintf(stderr,"Could not open %s for input\n",fn);
exit(1);
}
return fd;
}
FILE *wopen(fn)
char *fn;
{
FILE *fd;
if (strcmp(fn,"-")==0) fd=fdopen(1,"w"); else fd=fopen(fn,"w");
if (fd==NULL) {
fprintf(stderr,"Could not open %s for output\n",fn);
exit(1);
}
return fd;
}
int debug_flag=1;
int memory_flag=0;
void warning(char *format, ...)
{
char *p;
aux_sprintf(p, format);
printf("%s Warning: %s", deb_pref, p);
fflush(stdout);
}
int deb_crash=DEB_EXIT;
void error(char *format, ...)
{
char *p;
aux_sprintf(p, format);
printf("%s %s\n", deb_pref, p);
fflush(stdout);
if (deb_crash==DEB_CORE) kill(getpid(),6);
else exit(1);
}
char *deb_pref="";
int deb_mode=DEB_CPU;
double deb_cpu=-1, deb_real=-1;
real time_temp=0.0;
double realtime()
{
#ifdef PARIX
return ((double)TimeNowLow())/(double)CLK_TCK_LOW;
#else
#ifdef CM5
if (time_temp==0.0) {
CMMD_node_timer_clear(0);
CMMD_node_timer_start(0);
}
CMMD_node_timer_stop(0);
time_temp = (real)CMMD_node_timer_elapsed(0);
CMMD_node_timer_start(0);
return time_temp;
#else
struct timeval tv;
struct timezone tzv;
gettimeofday(&tv, &tzv);
/* debug("Time: %d seconds, %d microseconds, % 15.3f\n",
tv.tv_sec, tv.tv_usec, (double)tv.tv_sec + 1e-6*(double)tv.tv_usec); */
return (double)tv.tv_sec + 1e-6*(double)tv.tv_usec;
#endif
#endif
}
double cputime() {
#ifdef CM5
return realtime();
#else
struct tms buf;
times(&buf);
return (double)buf.tms_utime/(double)CLK_TCK;
#endif
}
void deb_print(char *p)
{
char tform[]="%s%6.2f %s", aform[]="%s%6.2f %2d%% %s";
real ct, rt;
int eff;
if (deb_cpu<0) deb_cpu=cputime();
if (deb_real<0) deb_real=realtime();
switch (deb_mode) {
case DEB_NONE:
printf("%s %s", deb_pref, p);
break;
case DEB_CPU:
printf(tform, deb_pref, cputime()-deb_cpu, p);
break;
case DEB_REAL:
printf(tform, deb_pref, realtime()-deb_real, p);
break;
case DEB_ALL:
ct = cputime()-deb_cpu;
rt = realtime()-deb_real;
if (rt!=0) eff = (int)(ct*100/rt); else eff=99;
if (eff>99) eff=99;
printf(aform, deb_pref, rt, eff, p);
break;
case DEB_MEM:
printf("%s %d %s", deb_pref, mem_size, p);
break;
default:
error("Illegal debugging mode %d.\n", deb_mode);
}
deb_cpu = cputime();
deb_real = realtime();
fflush(stdout);
}
void pdebug(char *format, ...)
{
char *p;
if (!debug_flag) return;
aux_sprintf(p, format);
deb_print(p);
}
void npdebug(char *format, ...)
{
char *p;
if (!debug_flag) return;
aux_sprintf(p, format);
printf("%s", p);
fflush(stdout);
}
#define time_check 1
#define time_n1 20
#define time_n2 16384
real time_cpu0[time_n1], time_real0[time_n1];
real time_cpu[time_n1], time_real[time_n1];
char *time_names[time_n1];
short time_ind[time_n2];
short time_next;
short time_last;
short time_initflag=0;
void time_init(void)
{
int i;
for (i=0; i<time_n1; i++) {
time_cpu[i]=time_cpu[i]=time_cpu0[i]=time_cpu0[i]=0;
time_names[i]=NULL;
}
for (i=0; i<time_n2; i++) time_ind[i]=-1;
time_next=0;
time_last=0;
time_initflag=1;
}
int time_label(char *str, int create)
{
int i, j;
char *s;
if (!time_initflag) error("Timer not initialized.");
for (i=0, s=str; *s && i<time_n2; s++) i+=(int)*s;
j = time_ind[i];
if (j<0) {
if (!create) error("Timer label \"%s\" not found.", str);
if (time_next>=time_n1) error("Too many Timer labels.");
time_ind[i] = j = time_next++;
time_names[j] = copy(str);
}
#if time_check
else if (strcmp(time_names[j], str))
error("Time label conflict: %s and %s.\n", str, time_names[j]);
#endif
return j;
}
void time_start(char *str)
{
if (!time_initflag) time_init();
time_last = time_label(str, 1);
time_cpu0[time_last] = cputime();
time_real0[time_last] = realtime();
}
void time_stop(char *str)
{
int i;
i = time_label(str, 0);
time_cpu[i] += cputime() - time_cpu0[i];
time_real[i] += realtime() - time_real0[i];
if (time_last==i) time_last = -1;
}
void time_reset(char *str)
{
int i;
i = time_label(str, 0);
time_cpu[i] = time_real[i] = 0;
}
real time_val(char *str)
{
int i;
i = time_label(str, 0);
return time_cpu[i];
}
real time_lap(char *str)
{
int i;
i = time_label(str, 0);
return cputime() - time_cpu0[i];
}
char *time_string_lap(char *str)
{
int i;
i = time_label(str, 0);
return stringf("cpu: %6.2f, real: %6.2f", cputime() - time_cpu0[i], realtime() - time_real0[i]);
}
void time_seq(char *s)
{
if (time_last>=0) {
time_cpu[time_last] += cputime() - time_cpu0[time_last];
time_real[time_last] += realtime() - time_real0[time_last];
time_last = -1;
}
if (s) time_start(s);
}
void time_print(void)
{
int i;
char *s;
if (!time_initflag) error("Timer not initialized.");
time_seq(NULL);
s = "\nCumulative timing results:\n Label Real CPU\n";
for (i=0; i<time_n1; i++) {
if (!time_names[i]) break;
s = stringf("%s%8s %10.3f %10.3f\n", s, time_names[i], time_real[i], time_cpu[i]);
}
printf("%s\n", s);
}
#if SRANDOM
extern int rand();
#else
#ifndef DEC
extern long random();
#endif
#endif
real ran_real(void)
{
real r;
#if SRANDOM
r = (real)rand()/32768.0;
#else
r = (real)random()/2147483648.0;
#endif
/* printf("%g\n", r); */
return r;
}
char *s_lst(int* p, int len)
{
char *s;
int i;
s = "";
for (i=0; i<len; i++) s = stringf("%s %2d", s, p[i]);
return s;
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.