inline static void appendint(char **buffer, int *pos, int *size, long number, int width, char padding, int alignment, int always_sign) { char numbuf[NUM_BUF_SIZE]; register unsigned long magn, nmagn; register unsigned int i = NUM_BUF_SIZE - 1, neg = 0; if (number < 0) { neg = 1; magn = ((unsigned long) -(number + 1)) + 1; } else { magn = (unsigned long) number; } /* Can't right-pad 0's on integers */ if(alignment==0 && padding=='0') padding=' '; numbuf[i] = '\0'; do { nmagn = magn / 10; numbuf[--i] = (unsigned char)(magn - (nmagn * 10)) + '0'; magn = nmagn; } while (magn > 0 && i > 0); if (neg) { numbuf[--i] = '-'; } else if (always_sign) { numbuf[--i] = '+'; } appendstring(buffer, pos, size, &numbuf[i], width, 0, padding, alignment, (NUM_BUF_SIZE - 1) - i, neg, 0, always_sign); }
NMButton::NMButton(const char* text, NEvent* pevent, ...) : NStaticText(NRect(3, 20, getmaxy(stdscr)/2-3/2,getmaxx(stdscr)/2-20/2)) { appendstring(getcolorpair(COLOR_WHITE, COLOR_CYAN)," "); appendstring(getcolorpair(COLOR_WHITE, COLOR_CYAN) | A_BOLD ,text); appendstring(getcolorpair(COLOR_WHITE, COLOR_CYAN)," "); this->pevent = pevent; //размер кнопки resize(1, mbstrlen(text) + 2); //список клавиш на которые реагирует эта кнопка va_list pk; va_start(pk, pevent); int ch = va_arg(pk, int); while ( ch != 0) { keys.push_back((char)ch); ch = va_arg(pk, int); //следующий ключ } va_end(pk); }
void DeleteTemp(void) { STRING *list = NULL, *ptr; struct dirent *de; DIR *mydir; mydir = opendir("."); if (mydir) { while ((de = readdir(mydir))) { if (strncmp(de->d_name, "ezin", 4) == 0 && strlen(de->d_name) == 10 && CheckTemp(de->d_name)) appendstring(&list, de->d_name); } } for (ptr = list; ptr; ptr = ptr->next) unlink(ptr->string); freestringlist(list); }
inline static void append2n(char **buffer, int *pos, int *size, long number, int width, char padding, int alignment, int n, char *chartable, int expprec) { char numbuf[NUM_BUF_SIZE]; register unsigned long num; register unsigned int i = NUM_BUF_SIZE - 1; register int andbits = (1 << n) - 1; num = (unsigned long) number; numbuf[i] = '\0'; do { numbuf[--i] = chartable[(num & andbits)]; num >>= n; } while (num > 0); appendstring(buffer, pos, size, &numbuf[i], width, 0, padding, alignment, (NUM_BUF_SIZE - 1) - i, 0, expprec, 0); }
inline static void appenduint(char **buffer, int *pos, int *size, unsigned long number, int width, char padding, int alignment) { char numbuf[NUM_BUF_SIZE]; register unsigned long magn, nmagn; register unsigned int i = NUM_BUF_SIZE - 1; magn = (unsigned long) number; /* Can't right-pad 0's on integers */ if (alignment == 0 && padding == '0') padding = ' '; numbuf[i] = '\0'; do { nmagn = magn / 10; numbuf[--i] = (unsigned char)(magn - (nmagn * 10)) + '0'; magn = nmagn; } while (magn > 0 && i > 0); appendstring(buffer, pos, size, &numbuf[i], width, 0, padding, alignment, (NUM_BUF_SIZE - 1) - i, 0, 0, 0); }
const char *spitout(FILE *stream, const char *main, const char *sub, size_t *size) { char buffer[8192]; /* big enough for anything */ char cmain[128]=""; /* current main section */ char csub[128]=""; /* current sub section */ char *ptr; char *end; char display = 0; char *string; size_t stringlen=0; size_t stralloc=256; char base64 = 0; /* set to 1 if true */ enum { STATE_OUTSIDE, STATE_OUTER, STATE_INMAIN, STATE_INSUB, STATE_ILLEGAL } state = STATE_OUTSIDE; string = malloc(stralloc); if(!string) return NULL; string[0] = 0; /* zero first byte in case of no data */ while(fgets(buffer, sizeof(buffer), stream)) { ptr = buffer; /* pass white spaces */ EAT_SPACE(ptr); if('<' != *ptr) { if(display) { show(("=> %s", buffer)); string = appendstring(string, buffer, &stringlen, &stralloc, base64); show(("* %s\n", buffer)); } continue; } ptr++; EAT_SPACE(ptr); if('/' == *ptr) { /* end of a section */ ptr++; EAT_SPACE(ptr); end = ptr; EAT_WORD(end); *end = 0; if((state == STATE_INSUB) && !strcmp(csub, ptr)) { /* this is the end of the currently read sub section */ state--; csub[0]=0; /* no sub anymore */ display=0; } else if((state == STATE_INMAIN) && !strcmp(cmain, ptr)) { /* this is the end of the currently read main section */ state--; cmain[0]=0; /* no main anymore */ display=0; } else if(state == STATE_OUTER) { /* this is the end of the outermost file section */ state--; } } else if(!display) { /* this is the beginning of a section */ end = ptr; EAT_WORD(end); *end = 0; switch(state) { case STATE_OUTSIDE: /* Skip over the outermost element (<testcase>), but if it turns out to be a comment, completely ignore it below */ strcpy(cmain, ptr); state = STATE_OUTER; break; case STATE_OUTER: strcpy(cmain, ptr); state = STATE_INMAIN; break; case STATE_INMAIN: strcpy(csub, ptr); state = STATE_INSUB; break; default: break; } if(!end[1] != '>') { /* There might be attributes here. Check for those we know of and care about. */ if(strstr(&end[1], "base64=")) { /* rough and dirty, but "mostly" functional */ /* Treat all data as base64 encoded */ base64 = 1; } } } if(display) { string = appendstring(string, buffer, &stringlen, &stralloc, base64); show(("* %s\n", buffer)); } if((STATE_INSUB == state) && !strcmp(cmain, main) && !strcmp(csub, sub)) { show(("* (%d bytes) %s\n", stringlen, buffer)); display = 1; /* start displaying */ } else if ((*cmain == '?') || (*cmain == '!') || (*csub == '!')) { /* Ignore comments, DOCTYPEs and XML declarations */ show(("%d ignoring (%s/%s)\n", state, cmain, csub)); state--; } else { show(("%d (%s/%s): %s\n", state, cmain, csub, buffer)); display = 0; /* no display */ } } *size = stringlen; return string; }
/** * New sprintf implementation for PHP. * * Modifiers: * * " " pad integers with spaces * "-" left adjusted field * n field size * "."n precision (floats only) * "+" Always place a sign (+ or -) in front of a number * * Type specifiers: * * "%" literal "%", modifiers are ignored. * "b" integer argument is printed as binary * "c" integer argument is printed as a single character * "d" argument is an integer * "f" the argument is a float * "o" integer argument is printed as octal * "s" argument is a string * "x" integer argument is printed as lowercase hexadecimal * "X" integer argument is printed as uppercase hexadecimal */ char *string_printf(const char *format, int len, CArrRef args, int *outlen) { Array vargs = args; if (!vargs.isNull() && !vargs->isVectorData()) { vargs = Array::Create(); for (ArrayIter iter(args); iter; ++iter) { vargs.append(iter.second()); } } if (len == 0) { return strdup(""); } int size = 240; char *result = (char *)malloc(size); int outpos = 0; int argnum = 0, currarg = 1; for (int inpos = 0; inpos < len; ++inpos) { char ch = format[inpos]; int expprec = 0; if (ch != '%') { appendchar(&result, &outpos, &size, ch); continue; } if (format[inpos + 1] == '%') { appendchar(&result, &outpos, &size, '%'); inpos++; continue; } /* starting a new format specifier, reset variables */ int alignment = ALIGN_RIGHT; int adjusting = 0; char padding = ' '; int always_sign = 0; int width, precision; inpos++; /* skip the '%' */ ch = format[inpos]; if (isascii(ch) && !isalpha(ch)) { /* first look for argnum */ int temppos = inpos; while (isdigit((int)format[temppos])) temppos++; if (format[temppos] == '$') { argnum = getnumber(format, &inpos); if (argnum <= 0) { free(result); throw_invalid_argument("argnum: must be greater than zero"); return nullptr; } inpos++; /* skip the '$' */ } else { argnum = currarg++; } /* after argnum comes modifiers */ for (;; inpos++) { ch = format[inpos]; if (ch == ' ' || ch == '0') { padding = ch; } else if (ch == '-') { alignment = ALIGN_LEFT; /* space padding, the default */ } else if (ch == '+') { always_sign = 1; } else if (ch == '\'') { padding = format[++inpos]; } else { break; } } ch = format[inpos]; /* after modifiers comes width */ if (isdigit(ch)) { if ((width = getnumber(format, &inpos)) < 0) { free(result); throw_invalid_argument("width: must be greater than zero " "and less than %d", INT_MAX); return nullptr; } adjusting |= ADJ_WIDTH; } else { width = 0; } ch = format[inpos]; /* after width and argnum comes precision */ if (ch == '.') { ch = format[++inpos]; if (isdigit((int)ch)) { if ((precision = getnumber(format, &inpos)) < 0) { free(result); throw_invalid_argument("precision: must be greater than zero " "and less than %d", INT_MAX); return nullptr; } ch = format[inpos]; adjusting |= ADJ_PRECISION; expprec = 1; } else { precision = 0; } } else { precision = 0; } } else { width = precision = 0; argnum = currarg++; } if (argnum > vargs.size()) { free(result); throw_invalid_argument("arguments: (too few)"); return nullptr; } if (ch == 'l') { ch = format[++inpos]; } /* now we expect to find a type specifier */ Variant tmp = vargs[argnum-1]; switch (ch) { case 's': { String s = tmp.toString(); appendstring(&result, &outpos, &size, s.c_str(), width, precision, padding, alignment, s.size(), 0, expprec, 0); break; } case 'd': appendint(&result, &outpos, &size, tmp.toInt64(), width, padding, alignment, always_sign); break; case 'u': appenduint(&result, &outpos, &size, tmp.toInt64(), width, padding, alignment); break; case 'g': case 'G': case 'e': case 'E': case 'f': case 'F': appenddouble(&result, &outpos, &size, tmp.toDouble(), width, padding, alignment, precision, adjusting, ch, always_sign); break; case 'c': appendchar(&result, &outpos, &size, tmp.toByte()); break; case 'o': append2n(&result, &outpos, &size, tmp.toInt64(), width, padding, alignment, 3, hexchars, expprec); break; case 'x': append2n(&result, &outpos, &size, tmp.toInt64(), width, padding, alignment, 4, hexchars, expprec); break; case 'X': append2n(&result, &outpos, &size, tmp.toInt64(), width, padding, alignment, 4, HEXCHARS, expprec); break; case 'b': append2n(&result, &outpos, &size, tmp.toInt64(), width, padding, alignment, 1, hexchars, expprec); break; case '%': appendchar(&result, &outpos, &size, '%'); break; default: break; } } /* possibly, we have to make sure we have room for the terminating null? */ result[outpos]=0; if (outlen) *outlen = outpos; return result; }
inline static void appenddouble(char **buffer, int *pos, int *size, double number, int width, char padding, int alignment, int precision, int adjust, char fmt, int always_sign) { char num_buf[NUM_BUF_SIZE]; char *s = nullptr; int s_len = 0, is_negative = 0; if ((adjust & ADJ_PRECISION) == 0) { precision = FLOAT_PRECISION; } else if (precision > MAX_FLOAT_PRECISION) { precision = MAX_FLOAT_PRECISION; } if (isnan(number)) { is_negative = (number<0); appendstring(buffer, pos, size, "NaN", 3, 0, padding, alignment, 3, is_negative, 0, always_sign); return; } if (isinf(number)) { is_negative = (number<0); appendstring(buffer, pos, size, "INF", 3, 0, padding, alignment, 3, is_negative, 0, always_sign); return; } switch (fmt) { case 'e': case 'E': case 'f': case 'F': s = php_conv_fp((fmt == 'f')?'F':fmt, number, 0, precision, '.', &is_negative, &num_buf[1], &s_len); if (is_negative) { num_buf[0] = '-'; s = num_buf; s_len++; } else if (always_sign) { num_buf[0] = '+'; s = num_buf; s_len++; } break; case 'g': case 'G': if (precision == 0) precision = 1; /* * * We use &num_buf[ 1 ], so that we have room for the sign */ s = php_gcvt(number, precision, '.', (fmt == 'G')?'E':'e', &num_buf[1]); is_negative = 0; if (*s == '-') { is_negative = 1; s = &num_buf[1]; } else if (always_sign) { num_buf[0] = '+'; s = num_buf; } s_len = strlen(s); break; } appendstring(buffer, pos, size, s, width, 0, padding, alignment, s_len, is_negative, 0, always_sign); }
inline static void appenddouble(StringBuffer *buffer, double number, int width, char padding, int alignment, int precision, int adjust, char fmt, int always_sign) { char num_buf[NUM_BUF_SIZE]; char *s = nullptr; int s_len = 0, is_negative = 0; if ((adjust & ADJ_PRECISION) == 0) { precision = FLOAT_PRECISION; } else if (precision > MAX_FLOAT_PRECISION) { precision = MAX_FLOAT_PRECISION; } if (isnan(number)) { is_negative = (number<0); appendstring(buffer, "NaN", 3, 0, padding, alignment, 3, is_negative, 0, always_sign); return; } if (isinf(number)) { is_negative = (number<0); appendstring(buffer, "INF", 3, 0, padding, alignment, 3, is_negative, 0, always_sign); return; } #if defined(HAVE_LOCALE_H) struct lconv *lconv; lconv = localeconv(); # define APPENDDOUBLE_LCONV_DECIMAL_POINT (*lconv->decimal_point) #else # define APPENDDOUBLE_LCONV_DECIMAL_POINT '.' #endif switch (fmt) { case 'e': case 'E': case 'f': case 'F': s = php_conv_fp((fmt == 'f')?'F':fmt, number, 0, precision, (fmt == 'f')?APPENDDOUBLE_LCONV_DECIMAL_POINT:'.', &is_negative, &num_buf[1], &s_len); if (is_negative) { num_buf[0] = '-'; s = num_buf; s_len++; } else if (always_sign) { num_buf[0] = '+'; s = num_buf; s_len++; } break; case 'g': case 'G': if (precision == 0) precision = 1; /* * * We use &num_buf[ 1 ], so that we have room for the sign */ s = php_gcvt(number, precision, APPENDDOUBLE_LCONV_DECIMAL_POINT, (fmt == 'G')?'E':'e', &num_buf[1]); is_negative = 0; if (*s == '-') { is_negative = 1; s = &num_buf[1]; } else if (always_sign) { num_buf[0] = '+'; s = num_buf; } s_len = strlen(s); break; } appendstring(buffer, s, width, 0, padding, alignment, s_len, is_negative, 0, always_sign); }
/** * Write a File to disk * * @param lsdd * Set the Output to be a SDD file * @param nerr * Error Return Flag * - 0 on Success * * @date 970702: Changed lckey and lkchar to lckeyExact and lkcharExact * throughout xw.c. This will allow files to begin with * the same string as the various options (eg. sacxz.021.z) * maf. * @date 910731: Bug fixed in options PREPEND, DELETE, CHANGE. * @date 900904: Added SDD as a format for write. * @date 881228: Added four new options for generating write file list * from data file list: APPEND, PREPEND, CHANGE, DELETE. * @date 880204: Fixed logic involving use of DIR option in READ and WRITE * by adding an ON/OFF flag as well as a directory name. * @date 880115: Deleted call that forced default directory to lowercase. * @date 870626: Added default directory option. * @date 860917: Changed to character lists for storing data file names. * @date 850730: Deleted SOCKITTOME format. * @date 830120: Added SOCK and CI output formats. * @date 820721: Changed to newest set of parsing and checking functions. * @date 810120: Changed to output message retrieval from disk. * @date 810203: Fixed bug in file overwrite option. * */ void xw(int lsdd, int *nerr) { int i; char delimiter[2], kcdir[9], kchange[MCPFN+1], kdirpart[MCPFN+1]; char kfile[MCPFN+1], kpdir[9], kstring[MCPFN+1], ktemp[9]; int lexpnd; int jdfl, nchange, nchar, nchg, ndx1, ndx2; int nlen, nstr, nstring, nwrdir; static int lwrdir = FALSE; char *cattemp; char *strtemp1, *strtemp2, *strtemp3; char *file; string_list *list, *files; kschan[12]='\0'; kschdr[80]='\0'; ksclas[4]='\0'; kscom[40]='\0'; ksevnm[8]='\0'; ksfrmt[8]='\0'; ksstnm[8]='\0'; memset(kfile, 0, sizeof(kfile)); memset(kdirpart, 0, sizeof(kdirpart)); memset(kchange, 0, sizeof(kchange)); memset(ktemp, 0, sizeof(ktemp)); memset(kstring, 0, sizeof(kstring)); memset(kpdir, 0, sizeof(kpdir)); memset(kcdir, 0, sizeof(kcdir)); memset(delimiter, 0, sizeof(delimiter)); lexpnd = FALSE; *nerr = 0; files = string_list_init(); list = NULL; if( lsdd ) cmdfm.iwfmt = 3; /* PARSING PHASE: */ /* - Loop on each token in command: */ while ( lcmore( nerr ) ){ /* -- "SAC|ALPHA": set format to be used in writing files. */ if( lckeyExact( "SAC#$",6 ) ) cmdfm.iwfmt = 1; else if( lckeyExact( "ALPHA#$",8 ) ) cmdfm.iwfmt = 2; else if( lckeyExact( "CI#$",5 ) ) cmdfm.iwfmt = 2; else if( lckeyExact( "SDD#$",6 ) ) cmdfm.iwfmt = 3; else if( lckeyExact( "XDR#$",6 ) ) { cmdfm.iwfmt = 4; } else if( lckeyExact( "SEGY#$", 7 ) ) cmdfm.iwfmt = 5; /* -- "OVER": overwrite files from previous READ command. */ else if( lckeyExact( "OVER#$",7 ) ){ cmdfm.lovrrq = TRUE; lexpnd = FALSE; string_list_extend(files, datafiles); } /* generate names from the KSTCMP header field */ else if( lckeyExact( "KSTCMP#$",9 ) ){ lexpnd = FALSE; gennames("KSTCMP ",7,files,string_list_length(datafiles),nerr); if(*nerr != 0) goto L_8888; } /* -- "APPEND string": append string to filenames from READ command. */ else if( lkcharExact( "APPEND#$",9, MCPFN, kstring,MCPFN+1, &nstring ) ){ for(i = 0; i < cmdfm.ndfl; i++) { strtemp1 = string_list_get(datafiles, i); appendstring( kstring,MCPFN+1, strtemp1, strlen(strtemp1)+2, kfile,MCPFN+1 ); string_list_put(files, kfile, MCPFN+1); if( *nerr != 0 ) goto L_8888; } cmdfm.lovrrq = FALSE; lexpnd = TRUE; } /* -- "PREPEND string": prepend string to filenames from READ command. */ else if( lkcharExact( "PREPEND#$",10, MCPFN, kstring,MCPFN+1, &nstring ) ){ for(i = 0; i < cmdfm.ndfl; i++) { strtemp1 = malloc(nstring+1); strncpy(strtemp1,kstring,nstring); strtemp1[nstring] = '\0'; strtemp2 = string_list_get(datafiles, i); prependstring( strtemp1, nstring+1, strtemp2, strlen(strtemp2)+2, kfile,MCPFN+1); free(strtemp1); string_list_put(files, kfile, MCPFN+1); if( *nerr != 0 ) goto L_8888; } cmdfm.lovrrq = FALSE; lexpnd = TRUE; } /* -- "DELETE string": delete string from filenames from READ command. */ else if( lkcharExact( "DELETE#$",9, MCPFN, kstring,MCPFN+1, &nstring ) ){ for(i = 0; i < cmdfm.ndfl; i++) { strtemp1 = malloc(nstring+1); strncpy(strtemp1,kstring,nstring); strtemp1[nstring] = '\0'; strtemp2 = string_list_get(datafiles, i); deletestring( strtemp1, nstring+1, strtemp2, strlen(strtemp2)+2, kfile,MCPFN+1); free(strtemp1); string_list_put(files, kfile, MCPFN+1); if( *nerr != 0 ) goto L_8888; } cmdfm.lovrrq = FALSE; lexpnd = TRUE; } /* -- "CHANGE string1 string2": change string1 to string2 in READ filenames. */ else if( lkcharExact( "CHANGE#$",9, MCPFN, kstring,MCPFN+1, &nstring ) ){ lcchar( MCPFN, kchange,MCPFN+1, &nchange ); for(i = 0; i < cmdfm.ndfl; i++) { nstr = indexb( kstring,MCPFN+1 ); nchg = indexb( kchange,MCPFN+1 ); strtemp1 = malloc(nstr+1); strtemp2 = malloc(nchg+1); strncpy(strtemp1,kstring,nstr); strncpy(strtemp2,kchange,nchg); strtemp1[nstr] = '\0'; strtemp2[nchg] = '\0'; strtemp3 = string_list_get(datafiles, i); changestring( strtemp1, nstr+1, strtemp2, nchg+1, strtemp3, strlen(strtemp3)+2, kfile,MCPFN+1 ); free(strtemp1); free(strtemp2); string_list_put(files, kfile, MCPFN+1); if( *nerr != 0 ) goto L_8888; } cmdfm.lovrrq = FALSE; lexpnd = TRUE; } /* -- "DIR ON|OFF|CURRENT|name": set the name of the default subdirectory. */ else if( lkcharExact( "DIR#$",6, MCPFN, kmdfm.kwrdir,MCPFN+1, &nchar ) ){ modcase( TRUE, kmdfm.kwrdir, MCPW, ktemp ); if( strncmp(ktemp,"OFF ",8) == 0 ) { lwrdir = FALSE; } else if( strncmp(ktemp,"CURRENT ",8) == 0 ){ lwrdir = TRUE; fstrncpy( kmdfm.kwrdir, MCPFN, " ", 1); } else if( kmdfm.kwrdir[nchar - 1] != KDIRDL ){ /* If the string is mising the "/" path separator */ lwrdir = TRUE; delimiter[0] = KDIRDL; delimiter[1] = '\0'; subscpy( kmdfm.kwrdir, nchar, -1, MCPFN, delimiter ); } else { /* Path is not OFF, CURRENT and has the "/" at the end */ lwrdir = TRUE; } } /* -- "COMMIT|RECALLTRACE|ROLLBACK": how to treat existing data */ else if ( lckeyExact ( "COMMIT" , 7 ) ) cmdfm.icomORroll = COMMIT ; else if (lckeyExact ( "RECALLTRACE" , 12 ) ) cmdfm.icomORroll = RECALL ; else if ( lckeyExact ( "RECALL" , 7 ) ) cmdfm.icomORroll = RECALL ; else if ( lckeyExact ( "ROLLBACK" , 9 ) ) cmdfm.icomORroll = ROLLBACK ; /* -- "filelist": write files using names in new filelist. */ else if( ( list = lcdfl() ) ){ cmdfm.lovrrq = FALSE; lexpnd = FALSE; } /* -- Bad syntax. */ else{ cfmt( "ILLEGAL OPTION:",17 ); cresp(); } } /* end while ( lcmore( nerr ) ) */ /* - The above loop is over when one of two conditions has been met: * (1) An error in parsing has occurred. In this case NERR is > 0 . * (2) All the tokens in the command have been successfully parsed. */ if( *nerr != 0 ) goto L_8888; /* CHECKING PHASE: */ if(!list) { list = files; } else { /* List + Modifiers :: Use List */ string_list_free(files); files = NULL; } /* - Check for null write filelist. */ if( string_list_length(list) <= 0 ){ *nerr = 1311; setmsg( "ERROR", *nerr ); goto L_8888; } /* - Make sure the write filelist has as many entries as read filelist. */ if( string_list_length(list) != cmdfm.ndfl ){ *nerr = 1312; error(1312, "%d %d", string_list_length(list), cmdfm.ndfl); goto L_8888; } /* EXECUTION PHASE: */ /* - Commit or rollback data according to cmdfm.icomORroll */ alignFiles ( nerr ) ; if ( *nerr ) return ; /* - Echo expanded filelist if requested. */ if( cmdfm.lechof && lexpnd ){ setmsg( "OUTPUT", 0 ); for(i = 0; i < string_list_length(list); i++) { file = string_list_get(list, i); getdir( file, strlen(file)+1, kcdir,9, kfile,MCPFN+1 ); /* -- Echo the filename part if there is no directory part. */ if( strcmp(kcdir," ") == 0 ) apcmsg( kfile,MCPFN+1 ); /* -- Prepend the filename part with some special characters if * directory part is same as that of the previous file. */ else if( memcmp(kcdir,kpdir,min(strlen(kcdir),strlen(kpdir))) == 0 ){ cattemp = malloc(3+strlen(kfile)+1); strcpy(cattemp, "..."); strcat(cattemp,kfile); apcmsg( cattemp, 3+strlen(kfile)+1 ); free(cattemp); } /* -- Echo complete pathname if directory part is different. */ else{ apcmsg2(file, strlen(file)+1); strcpy( kpdir, kcdir ); } } wrtmsg( MUNOUT ); } /* - Write each file in memory to disk. */ nwrdir = indexb( kmdfm.kwrdir,MCPFN+1 ); for( jdfl = 1; jdfl <= cmdfm.ndfl; jdfl++ ){ /* -- Get file from memory manager. */ file = string_list_get(list, jdfl-1); getfil( jdfl, TRUE, &nlen, &ndx1, &ndx2, nerr ); if( *nerr != 0 ) goto L_8888; /* isolate file name */ file = string_list_get(list, jdfl-1); /* -- Check overwrite-protect flag in header record. */ if( cmdfm.lovrrq && !*lovrok ){ *nerr = 1303; setmsg( "ERROR", *nerr ); apcmsg2(file, strlen(file)+1); outmsg () ; clrmsg () ; goto L_8888; } /* -- Prepare output file name: * --- If directory option is ON (lwrdir=.TRUE. and nwrdir>0), * concatenate directory name with file name part of write file list. * --- If directory option is CURRENT (lwrdir=.TRUE. and nwrdir=0), * use file name part of write file list. * --- If directory option is OFF, use write file list. */ if( lwrdir ){ if( nwrdir > 0 ){ fstrncpy( kfile, MCPFN, kmdfm.kwrdir,min(nwrdir,MCPFN)); strtemp1 = file; strtemp2 = malloc(130-(nwrdir+1)); strncpy(strtemp2,kfile+nwrdir,MCPFN+1-(nwrdir + 1)); strtemp2[MCPFN+1-(nwrdir+1)] = '\0'; getdir( strtemp1, strlen(strtemp1)+1, kdirpart, MCPFN+1, strtemp2,-(nwrdir+1)+130); subscpy(kfile,nwrdir,-1,MCPFN,strtemp2); free(strtemp2); } else{ fstrncpy( kfile, MCPFN, " ", 1); getdir( file, strlen(file)+1, kdirpart,MCPFN+1, kfile,MCPFN+1 ); } } else { fstrncpy( kfile, MCPFN, file, strlen(file)); } /* -- Write file in appropriate format. */ if( cmdfm.iwfmt == 2 ) wrci( jdfl, kfile,MCPFN+1, "%#15.7g", nerr ); else if( cmdfm.iwfmt == 3 ) wrsdd( jdfl, kfile,MCPFN+1, TRUE, nerr ); else if( cmdfm.iwfmt == 4 ) wrxdr( jdfl, kfile,MCPFN+1, TRUE, nerr ); else if( cmdfm.iwfmt == 5 ) wrsegy( jdfl , kfile , nerr ) ; else wrsac( jdfl, kfile,MCPFN+1, TRUE, nerr ); if( *nerr != 0 ) goto L_8888; } /* end for ( jdfl ) */ L_8888: return; }
int parse_database() { FILE *f; char buf[128]; int i, lineno; char filename[128]; #ifndef __UNIXOS2__ strcpy(filename, CARD_DATABASE_FILE); #else strcpy(filename, (char*)__XOS2RedirRoot(CARD_DATABASE_FILE)); #endif f = fopen(filename, "r"); if (f == NULL) return -1; lastcard = -1; lineno = 0; for (;;) { if (getnextline(f, buf)) break; lineno++; if (buf[0] == '#') /* Comment. */ continue; if (strncmp(buf, "END", 3) == 0) /* End of database. */ break; if (strncmp(buf, "LINE", 4) == 0 && lastcard>=0) { /* Line of Device comment. */ /* Append to existing lines. */ appendstring(&card[lastcard].lines, buf + 5); continue; } /* * The following keywords require the trailing newline * to be deleted. */ i = strlen(buf); buf[--i] = '\0'; /* remove trailing spaces or tabs */ for(--i; i>=0 && (buf[i] == ' ' || buf[i] == '\011'); i--) ; if (i>=0) buf[i+1] = '\0'; else continue; /* skip empty lines */ if (strncmp(buf, "NAME", 4) == 0) { /* New entry. */ lastcard++; card[lastcard].name = malloc(strlen(buf + 5) + 1); strcpy(card[lastcard].name, buf + 5); card[lastcard].chipset = NULL; card[lastcard].server = NULL; card[lastcard].driver = NULL; card[lastcard].ramdac = NULL; card[lastcard].clockchip = NULL; card[lastcard].dacspeed = NULL; card[lastcard].flags = 0; card[lastcard].lines = ""; continue; } if (lastcard < 0) /* no NAME line found yet */ continue; if (strncmp(buf, "SEE", 3) == 0) { /* Reference to another entry. */ int i; i = lookupcard(buf + 4); if (i == -1) { printf("Error in database, invalid reference: %s.\n", buf + 4); free(card[lastcard].name); lastcard--; continue; } if (card[lastcard].chipset == NULL) card[lastcard].chipset = card[i].chipset; if (card[lastcard].server == NULL) card[lastcard].server = card[i].server; if (card[lastcard].driver == NULL) card[lastcard].driver = card[i].driver; if (card[lastcard].ramdac == NULL) card[lastcard].ramdac = card[i].ramdac; if (card[lastcard].clockchip == NULL) card[lastcard].clockchip = card[i].clockchip; if (card[lastcard].dacspeed == NULL) card[lastcard].dacspeed = card[i].dacspeed; card[lastcard].flags |= card[i].flags; appendstring(&card[lastcard].lines, card[i].lines); continue; } if (strncmp(buf, "CHIPSET", 7) == 0) { /* Chipset description. */ card[lastcard].chipset = malloc(strlen(buf + 8) + 1); strcpy(card[lastcard].chipset, buf + 8); continue; } if (strncmp(buf, "SERVER", 6) == 0) { /* Server identifier. */ card[lastcard].server = malloc(strlen(buf + 7) + 1); strcpy(card[lastcard].server, buf + 7); continue; } if (strncmp(buf, "DRIVER", 6) == 0) { /* Driver identifier. */ card[lastcard].driver = malloc(strlen(buf + 7) + 1); strcpy(card[lastcard].driver, buf + 7); continue; } if (strncmp(buf, "RAMDAC", 6) == 0) { /* Ramdac indentifier. */ card[lastcard].ramdac = malloc(strlen(buf + 7) + 1); strcpy(card[lastcard].ramdac, buf + 7); continue; } if (strncmp(buf, "CLOCKCHIP", 9) == 0) { /* Clockchip indentifier. */ card[lastcard].clockchip = malloc(strlen(buf + 10) + 1); strcpy(card[lastcard].clockchip, buf + 10); card[lastcard].flags |= NOCLOCKPROBE; continue; } if (strncmp(buf, "DACSPEED", 8) == 0) { /* Clockchip indentifier. */ card[lastcard].dacspeed = malloc(strlen(buf + 9) + 1); strcpy(card[lastcard].dacspeed, buf + 9); continue; } if (strncmp(buf, "NOCLOCKPROBE", 12) == 0) { card[lastcard].flags |= NOCLOCKPROBE; continue; } if (strncmp(buf, "UNSUPPORTED", 12) == 0) { card[lastcard].flags |= UNSUPPORTED; continue; } /* test for missing required fields */ if (card[lastcard].driver == NULL) { fprintf(stderr, "Warning DRIVER specification missing " "in Card database entry %s (line %d).\n", card[lastcard].name, lineno); keypress(); card[lastcard].driver = "unknown"; } if (card[lastcard].chipset == NULL) { fprintf(stderr, "Warning CHIPSET specification missing " "in Card database entry %s (line %d).\n", card[lastcard].name, lineno); keypress(); card[lastcard].chipset = "unknown"; } } fclose(f); /* * Add general comments. */ for (i = 0; i <= lastcard; i++) { if (card[i].server && strcmp(card[i].server, "S3") == 0) appendstring(&card[i].lines, s3_comment); if (card[i].chipset && strncmp(card[i].chipset, "CL-GD", 5) == 0) appendstring(&card[i].lines, cirrus_comment); } sort_database(); return 0; }
void PrintInteger(bool typeUnsigned, uint64_t argu, int base, uint64_t numbits, FormatterParams formatter, bool uppercaseDigits, char *&output, size_t &actualsize, char *end) { int64_t argi = 0; union { uint64_t *u64; signed int *i; signed char *c; signed short *s; int64_t *i64; } typepun; typepun.u64 = &argu; // cast the appropriate size to signed version switch(formatter.Length) { default: case None: case Long: argi = (int64_t)*typepun.i; break; case HalfHalf: argi = (int64_t)*typepun.c; break; case Half: argi = (int64_t)*typepun.s; break; case LongLong: argi = (int64_t)*typepun.i64; break; } bool negative = false; if(base == 10 && !typeUnsigned) { negative = argi < 0; } int digwidth = 0; int numPad0s = 0; int numPadWidth = 0; { int intwidth = 0; int digits = 0; // work out the number of decimal digits in the integer if(!negative) { uint64_t accum = argu; while(accum) { digits += 1; accum /= base; } } else { int64_t accum = argi; while(accum) { digits += 1; accum /= base; } } intwidth = digwidth = RDCMAX(1, digits); // printed int is 2 chars larger for 0x or 0b, and 1 char for 0 (octal) if(base == 16 || base == 2) intwidth += formatter.Flags & AlternateForm ? 2 : 0; if(base == 8) intwidth += formatter.Flags & AlternateForm ? 1 : 0; if(formatter.Precision != FormatterParams::NoPrecision && formatter.Precision > intwidth) numPad0s = formatter.Precision - intwidth; intwidth += numPad0s; // for decimal we can have a negative sign (or placeholder) if(base == 10) { if(negative) intwidth++; else if(formatter.Flags & (PrependPos | PrependSpace)) intwidth++; } if(formatter.Width != FormatterParams::NoWidth && formatter.Width > intwidth) numPadWidth = formatter.Width - intwidth; } // pad with spaces if necessary if((formatter.Flags & (LeftJustify | PadZeroes)) == 0 && numPadWidth > 0) addchars(output, actualsize, end, (size_t)numPadWidth, ' '); if(base == 16) { if(formatter.Flags & AlternateForm) { if(uppercaseDigits) appendstring(output, actualsize, end, "0X"); else appendstring(output, actualsize, end, "0x"); } // pad with 0s as appropriate if((formatter.Flags & (LeftJustify | PadZeroes)) == PadZeroes && numPadWidth > 0) addchars(output, actualsize, end, (size_t)numPadWidth, '0'); if(numPad0s > 0) addchars(output, actualsize, end, (size_t)numPad0s, '0'); bool left0s = true; // mask off each hex digit and print for(uint64_t i = 0; i < numbits; i += 4) { uint64_t shift = numbits - 4 - i; uint64_t mask = 0xfULL << shift; char digit = char((argu & mask) >> shift); if(digit == 0 && left0s && i + 4 < numbits) continue; left0s = false; if(digit < 10) addchar(output, actualsize, end, '0' + digit); else if(uppercaseDigits) addchar(output, actualsize, end, 'A' + digit - 10); else addchar(output, actualsize, end, 'a' + digit - 10); } } else if(base == 8)