📄 atlconf_misc.c
字号:
/* * Automatically Tuned Linear Algebra Software v3.8.0 * (C) Copyright 1998 R. Clint Whaley * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions, and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. The name of the ATLAS group or the names of its contributers may * not be used to endorse or promote products derived from this * software without specific written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE ATLAS GROUP OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. * */#include "atlconf.h"#include <time.h>void GetDate(int *month, int *day, int *year, int *hour, int *min){ time_t tv; struct tm *tp; tv = time(NULL); tp = localtime(&tv); *month = tp->tm_mon + 1; *day = tp->tm_mday; *year = tp->tm_year + 1900; *hour = tp->tm_hour; *min = tp->tm_min;}long GetInt(FILE *fpin, long Default, char *spc, char *expstr)/* * Gets a signed integral type from fpin. If nothing or garbage is entered, * Default is returned. */{ char str[64]; long iin; if (expstr) fprintf(stdout, "%sEnter %s [%d]: ", spc, expstr, Default); if (fgets(str, 64, fpin) == NULL) return(Default); if (sscanf(str, " %ld ", &iin) != 1) return(Default); return(iin);}long GetIntRange(long Default, long Min, long Max, char *spc, char *expstr){ long i; int keepOn=0; do { i = GetInt(stdin, Default, spc, expstr); if (i > Max) { keepOn = 1; fprintf(stderr, "\n%d larger than max value of %d. Try again.\n\n", i, Max); } else if (i < Min) { keepOn = 1; fprintf(stderr, "\n%d smaller than min value of %d. Try again.\n\n", i, Min); } else keepOn = 0; } while (keepOn); return(i);}long GetIntVer(long Default, long Min, long Max, char *spc, char *expstr){ long i, j; do { i = GetIntRange(Default, Min, Max, spc, expstr); fprintf(stdout, "%s You entered: %d\n", spc, i); j = GetIntRange(0, 0, 1, spc, "1 to reenter, 0 accepts"); } while(j); return(i);}void GetString(FILE *fpin, char *Default, char *spc, char *expstr, int len, char *str0)/* * Get a string of length len, not including NULL terminator; pads * any extra len with NULLs */{ char str[512], *sp; int i; assert(len+1 <= 512); if (expstr) { if (Default) fprintf(stdout, "%sEnter %s [%s]: ", spc, expstr, Default); else fprintf(stdout, "%sEnter %s:", spc, expstr); } sp = fgets(str, 512, fpin); if ( (sp == NULL) || (str[0] == '\0') || (str[0] == '\n') ) { if (Default) strcpy(str0, Default); else str0[0] = '\0'; return; } str[len] = '\0'; for (i=0; str0[i] = str[i]; i++); if (i) i--; while (Mciswspace(str0[i])) i--; while (++i < len) str0[i] = '\0'; str0[i] = '\0';}void GetStrVer(char *def, char *spc, char *expstr, int len, char *str){ int i; do { GetString(stdin, def, spc, expstr, len, str); fprintf(stdout, "%sYou have entered '%s'\n", spc, str); i = GetIntRange(0, 0, 1, spc, "1 to reenter, 0 to accept"); } while(i);}int IsYes(char def, char *spc, char *expstr){ char ch, ln[256]; fprintf(stdout, "%s%s [%c]: ", spc, expstr, def); if (fgets(ln, 256, stdin) == NULL) ch=def; else if (ln[0] == '\0' || ln[0] == '\n') ch=def; else ch = ln[0]; return( ((ch == 'y') || (ch == 'Y')) );}char GetChar(char def, char *spc, char *expstr){ char ch, ln[256]; fprintf(stdout, "%s%s [%c]: ", spc, expstr, def); if (fgets(ln, 256, stdin) == NULL) ch=def; else if (ln[0] == '\0' || ln[0] == '\n') ch=def; else ch = ln[0]; return(ch);}int FileIsThere(char *nam){ FILE *fp; fp = fopen(nam, "r"); if (fp == NULL) return(0); fclose(fp); return(1);}#include <stdarg.h>#define ATL_UseStringVarArgsvoid ATL_mprintf(int np, ...)/* * Prints same message to np output file streams */{ va_list argptr; FILE *fp[8]; char *form; int i; #ifdef ATL_UseStringVarArgs char ln[1024]; #endif if (np > 0) { va_start(argptr, np); assert(np <= 8); for (i=0; i < np; i++) fp[i] = va_arg(argptr, FILE *); form = va_arg(argptr, char *); #ifdef ATL_UseStringVarArgs vsprintf(ln, form, argptr); assert(strlen(ln) < 1024);/* sanity test only, will not stop overrun */ va_end(argptr); for (i=0; i < np; i++) if (fp[i]) fprintf(fp[i], ln); #else for (i=0; i < np; i++) if (fp[i]) vfprintf(fp[i], form, argptr); va_end(argptr); #endif }}int GetFirstInt(char *ln){ int i, iret=0; for (i=0; ln[i]; i++) { if (isdigit(ln[i])) { sscanf(ln+i, "%d", &iret); break; } } return(iret);}long long GetFirstLong(char *ln){ int i; long long iret=0; for (i=0; ln[i]; i++) { if (isdigit(ln[i])) { sscanf(ln+i, "%ld", &iret); break; } } return(iret);}double GetFirstDouble(char *ln)/* * Gets a double, which begins wt digit or "." (i.e., won't get e10) */{ int i; double dret=0; for (i=0; ln[i]; i++) { if (isdigit(ln[i])) { if (i > 0 && ln[i-1] == '.') i--; sscanf(ln+i, "%lf", &dret); break; } } return(dret);}int GetLastInt(char *ln){ int i, iret=0; for (i=0; ln[i]; i++); if (i > 0) for (i--; i > 0 && !isdigit(ln[i]); i--); if (i > 0 || (i == 0 && isdigit(ln[0]))) { while(isdigit(ln[i]) && i > 0) i--; if (!isdigit(ln[i])) i++; sscanf(ln+i, "%d", &iret); } return(iret);}long long GetLastLong(char *ln){ int i; long iret=0; for (i=0; ln[i]; i++); if (i > 0) for (i--; i > 0 && !isdigit(ln[i]); i--); if (i > 0 || (i == 0 && isdigit(ln[0]))) { while(isdigit(ln[i]) && i > 0) i--; if (!isdigit(ln[i])) i++; sscanf(ln+i, "%ld", &iret); } return(iret);}int fNumLines(char *fnam){ FILE *fp; char ln[256]; int i; fp = fopen(fnam, "r"); assert(fp != NULL); for (i=0; fgets(ln, 256, fp); i++); return(i);}char *CmndResults(char *targ, char *cmnd){ static char tnam[128]; static int FirstTime=1; char ln[512]; if (FirstTime) { FirstTime = 0; assert(tmpnam(tnam)); } if (targ) sprintf(ln, "ssh %s \"%s\" > %s 2>&1 \n", targ, cmnd, tnam); else sprintf(ln, "%s > %s 2>&1\n", cmnd, tnam); if (!system(ln)) return(tnam); else return(NULL);}int CmndOneLine(char *targ, char *cmnd, char *ln)/* * executes a system call with contents of cmnd, returns the output in ln; * Returns value returned by system call * if targ is set, we ssh to that machine */{ int i; FILE *fp; char *tnam; ln[0] = '\0'; tnam = CmndResults(targ, cmnd); if (tnam) { fp = fopen(tnam, "r"); assert(fp); if (!fgets(ln, 2048, fp)) ln[0] = '\0'; fclose(fp); return(0); } else ln[0] = '\0'; return(1);}int GetIntBeforeWord(char *word, char *ln)/* * Finds integer before word in sentence. * RETURNS: integer on success, BADINT on failure */{ char *sp; sp = strstr(ln, word); if (sp == ln) return(BADINT); sp--; while(isspace(*sp) && sp != ln) sp--; if (sp == ln) return(BADINT); while (isdigit(*sp) && sp != ln) sp--; if (sp == ln) return(BADINT); return(atoi(sp));}int GetScreenHeight()/* * Returns the number of vertical lines window has */{ int i; for (i=160; i; i--) fprintf(stdout, "%03d\n", i); i = GetIntRange(0, 0, 160, "", "number at top left of screen"); return(i);}void GetEnter(FILE *fpout){ char ln[128]; fprintf(fpout, "---------- PRESS ENTER TO CONTINUE ---------- "); fgets(ln, 128, stdin);}int DisplayFile(char *fnam, FILE *fpout, int nlines){ FILE *fp; char ln[256]; int i, GoOn=1; fp = fopen(fnam, "r"); if (fp == NULL) { fprintf(stderr, "Unable to open file '%s', continuing without display.\n", fnam); return(-1); } if (nlines) { do { for (i=0; i < nlines; i++) { GoOn = (fgets(ln, 256, fp) != NULL); if (!GoOn) break; fprintf(fpout, "%s", ln);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -