// This returns #t if successful, or a number (the correct length) if there was a mismatched length. ptr s_fftw_execute (ptr vec, uptr plan) { int i; int len = Svector_length(vec); int N = len / 2; clock_t start, end; plan_t* p = (plan_t*) plan; /*printf("Executing!! len %i incoming len %i\n", p->vec_len, Svector_length(vec)); for (i=0; i<10; i++) printf(" Got element %i %lf\n", i, ((double*)p->vec)[i]); printf(" Got element %i %lf\n", 262000, ((double*)p->vec)[262000]); printf(" Got element %i %lf\n", 524000, ((double*)p->vec)[524000]);*/ // TODO: CHECK THAT LENGTH IS RIGHT! if (N != p->vec_len) { printf("Mismatched lengths! %i %i\n", N, p->vec_len); return(Sfixnum((uptr)p->vec_len)); } //printf("Measuring... "); fflush( 0 ); //start = clock(); //end = clock(); //printf("Done. (time used %i)\n", end - start); fflush( 0 ); //printf("Filling... \n"); fflush( 0 ); for(i=0; i<len; i+=2) { /*printf("Loading: real %lf, imag %lf\n", Sflonum_value(Svector_ref(vec, i)), Sflonum_value(Svector_ref(vec, i+1)));*/ ((double*)p->vec)[i] = Sflonum_value(Svector_ref(vec, i)); ((double*)p->vec)[i+1] = Sflonum_value(Svector_ref(vec, i+1)); } //printf("Done\n"); //printf("Executing... "); fflush( 0 ); //start = clock(); fftw_execute(p->plan); //end = clock(); //printf("Done. (time used %i)\n", end - start); fflush( 0 ); //printf("Clocks per sec... %i\n", CLOCKS_PER_SEC); // Fill the output back into the vector: for(i=0; i<len; i++) { //printf("Unloading: %lf\n", ((double*)out)[i]); Svector_set(vec, i, Sflonum(((double*)p->vec)[i])); } }
ptr S_asctime(ptr dtvec) { char buf[26]; if (dtvec == Sfalse) { time_t tx = time(NULL); if (ctime_r(&tx, buf) == NULL) return Sfalse; } else { struct tm tmx; tmx.tm_sec = (int)Sinteger_value(Svector_ref(dtvec, dtvec_sec)); tmx.tm_min = (int)Sinteger_value(Svector_ref(dtvec, dtvec_min)); tmx.tm_hour = (int)Sinteger_value(Svector_ref(dtvec, dtvec_hour)); tmx.tm_mday = (int)Sinteger_value(Svector_ref(dtvec, dtvec_mday)); tmx.tm_mon = (int)Sinteger_value(Svector_ref(dtvec, dtvec_mon)) - 1; tmx.tm_year = (int)Sinteger_value(Svector_ref(dtvec, dtvec_year)); tmx.tm_wday = (int)Sinteger_value(Svector_ref(dtvec, dtvec_wday)); tmx.tm_yday = (int)Sinteger_value(Svector_ref(dtvec, dtvec_yday)); tmx.tm_isdst = (int)Sinteger_value(Svector_ref(dtvec, dtvec_isdst)); if (asctime_r(&tmx, buf) == NULL) return Sfalse; } return S_string(buf, 24) /* all but trailing newline */; }
void S_gc_init() { IGEN g; INT i; S_checkheap = 0; /* 0 for disabled, 1 for enabled */ S_checkheap_errors = 0; /* count of errors detected by checkheap */ checkheap_noisy = 0; /* 0 for error output only; 1 for more noisy output */ if (S_checkheap) { printf(checkheap_noisy ? "NB: check_heap is enabled and noisy\n" : "NB: check_heap_is_enabled\n"); fflush(stdout); } #ifndef WIN32 for (g = 0; g <= static_generation; g++) { S_child_processes[g] = Snil; } #endif /* WIN32 */ if (!S_boot_time) return; for (g = 0; g <= static_generation; g++) { S_G.guardians[g] = Snil; S_G.locked_objects[g] = Snil; S_G.unlocked_objects[g] = Snil; } S_G.max_nonstatic_generation = S_G.new_max_nonstatic_generation = S_G.min_free_gen = S_G.new_min_free_gen = default_max_nonstatic_generation; for (g = 0; g <= static_generation; g += 1) { for (i = 0; i < countof_types; i += 1) { S_G.countof[g][i] = 0; S_G.bytesof[g][i] = 0; } S_G.gctimestamp[g] = 0; S_G.rtds_with_counts[g] = Snil; } S_G.countof[static_generation][countof_oblist] += 1; S_G.bytesof[static_generation][countof_oblist] += S_G.oblist_length * sizeof(bucket *); S_protect(&S_G.static_id); S_G.static_id = S_intern((const unsigned char *)"static"); S_protect(&S_G.countof_names); S_G.countof_names = S_vector(countof_types); for (i = 0; i < countof_types; i += 1) { INITVECTIT(S_G.countof_names, i) = FIX(0); S_G.countof_size[i] = 0; } INITVECTIT(S_G.countof_names, countof_pair) = S_intern((const unsigned char *)"pair"); S_G.countof_size[countof_pair] = size_pair; INITVECTIT(S_G.countof_names, countof_symbol) = S_intern((const unsigned char *)"symbol"); S_G.countof_size[countof_symbol] = size_symbol; INITVECTIT(S_G.countof_names, countof_flonum) = S_intern((const unsigned char *)"flonum"); S_G.countof_size[countof_flonum] = size_flonum; INITVECTIT(S_G.countof_names, countof_closure) = S_intern((const unsigned char *)"procedure"); S_G.countof_size[countof_closure] = 0; INITVECTIT(S_G.countof_names, countof_continuation) = S_intern((const unsigned char *)"continuation"); S_G.countof_size[countof_continuation] = size_continuation; INITVECTIT(S_G.countof_names, countof_bignum) = S_intern((const unsigned char *)"bignum"); S_G.countof_size[countof_bignum] = 0; INITVECTIT(S_G.countof_names, countof_ratnum) = S_intern((const unsigned char *)"ratnum"); S_G.countof_size[countof_ratnum] = size_ratnum; INITVECTIT(S_G.countof_names, countof_inexactnum) = S_intern((const unsigned char *)"inexactnum"); S_G.countof_size[countof_inexactnum] = size_inexactnum; INITVECTIT(S_G.countof_names, countof_exactnum) = S_intern((const unsigned char *)"exactnum"); S_G.countof_size[countof_exactnum] = size_exactnum; INITVECTIT(S_G.countof_names, countof_box) = S_intern((const unsigned char *)"box"); S_G.countof_size[countof_box] = size_box; INITVECTIT(S_G.countof_names, countof_port) = S_intern((const unsigned char *)"port"); S_G.countof_size[countof_port] = size_port; INITVECTIT(S_G.countof_names, countof_code) = S_intern((const unsigned char *)"code"); S_G.countof_size[countof_code] = 0; INITVECTIT(S_G.countof_names, countof_thread) = S_intern((const unsigned char *)"thread"); S_G.countof_size[countof_thread] = size_thread; INITVECTIT(S_G.countof_names, countof_tlc) = S_intern((const unsigned char *)"tlc"); S_G.countof_size[countof_tlc] = size_tlc; INITVECTIT(S_G.countof_names, countof_rtd_counts) = S_intern((const unsigned char *)"rtd-counts"); S_G.countof_size[countof_rtd_counts] = size_rtd_counts; INITVECTIT(S_G.countof_names, countof_stack) = S_intern((const unsigned char *)"stack"); S_G.countof_size[countof_stack] = 0; INITVECTIT(S_G.countof_names, countof_relocation_table) = S_intern((const unsigned char *)"reloc-table"); S_G.countof_size[countof_relocation_table] = 0; INITVECTIT(S_G.countof_names, countof_weakpair) = S_intern((const unsigned char *)"weakpair"); S_G.countof_size[countof_weakpair] = size_pair; INITVECTIT(S_G.countof_names, countof_vector) = S_intern((const unsigned char *)"vector"); S_G.countof_size[countof_vector] = 0; INITVECTIT(S_G.countof_names, countof_string) = S_intern((const unsigned char *)"string"); S_G.countof_size[countof_string] = 0; INITVECTIT(S_G.countof_names, countof_fxvector) = S_intern((const unsigned char *)"fxvector"); S_G.countof_size[countof_fxvector] = 0; INITVECTIT(S_G.countof_names, countof_bytevector) = S_intern((const unsigned char *)"bytevector"); S_G.countof_size[countof_bytevector] = 0; INITVECTIT(S_G.countof_names, countof_locked) = S_intern((const unsigned char *)"locked"); S_G.countof_size[countof_locked] = 0; INITVECTIT(S_G.countof_names, countof_guardian) = S_intern((const unsigned char *)"guardian"); S_G.countof_size[countof_guardian] = size_guardian_entry; INITVECTIT(S_G.countof_names, countof_oblist) = S_intern((const unsigned char *)"oblist"); S_G.countof_size[countof_guardian] = 0; INITVECTIT(S_G.countof_names, countof_ephemeron) = S_intern((const unsigned char *)"ephemron"); S_G.countof_size[countof_ephemeron] = 0; for (i = 0; i < countof_types; i += 1) { if (Svector_ref(S_G.countof_names, i) == FIX(0)) { fprintf(stderr, "uninitialized countof_name at index %d\n", i); S_abnormal_exit(); } } }
ptr S_mktime(ptr dtvec) { time_t tx; struct tm tmx; long orig_tzoff = (long)UNFIX(INITVECTIT(dtvec, dtvec_tzoff)); tmx.tm_sec = (int)Sinteger_value(Svector_ref(dtvec, dtvec_sec)); tmx.tm_min = (int)Sinteger_value(Svector_ref(dtvec, dtvec_min)); tmx.tm_hour = (int)Sinteger_value(Svector_ref(dtvec, dtvec_hour)); tmx.tm_mday = (int)Sinteger_value(Svector_ref(dtvec, dtvec_mday)); tmx.tm_mon = (int)Sinteger_value(Svector_ref(dtvec, dtvec_mon)) - 1; tmx.tm_year = (int)Sinteger_value(Svector_ref(dtvec, dtvec_year)); tmx.tm_isdst = 0; if ((tx = mktime(&tmx)) == (time_t)-1) return Sfalse; if (tmx.tm_isdst == 1) { /* guessed wrong */ tmx.tm_sec = (int)Sinteger_value(Svector_ref(dtvec, dtvec_sec)); tmx.tm_min = (int)Sinteger_value(Svector_ref(dtvec, dtvec_min)); tmx.tm_hour = (int)Sinteger_value(Svector_ref(dtvec, dtvec_hour)); tmx.tm_mday = (int)Sinteger_value(Svector_ref(dtvec, dtvec_mday)); tmx.tm_mon = (int)Sinteger_value(Svector_ref(dtvec, dtvec_mon)) - 1; tmx.tm_year = (int)Sinteger_value(Svector_ref(dtvec, dtvec_year)); tmx.tm_isdst = 1; if ((tx = mktime(&tmx)) == (time_t)-1) return Sfalse; } /* mktime may have normalized some values, set wday and yday */ INITVECTIT(dtvec, dtvec_sec) = Sinteger(tmx.tm_sec); INITVECTIT(dtvec, dtvec_min) = Sinteger(tmx.tm_min); INITVECTIT(dtvec, dtvec_hour) = Sinteger(tmx.tm_hour); INITVECTIT(dtvec, dtvec_mday) = Sinteger(tmx.tm_mday); INITVECTIT(dtvec, dtvec_mon) = Sinteger(tmx.tm_mon + 1); INITVECTIT(dtvec, dtvec_year) = Sinteger(tmx.tm_year); INITVECTIT(dtvec, dtvec_wday) = Sinteger(tmx.tm_wday); INITVECTIT(dtvec, dtvec_yday) = Sinteger(tmx.tm_yday); #ifdef WIN32 { TIME_ZONE_INFORMATION tz; DWORD rc = GetTimeZoneInformation(&tz); long tzoff; switch (rc) { case TIME_ZONE_ID_UNKNOWN: case TIME_ZONE_ID_STANDARD: tzoff = tz.Bias * -60; break; case TIME_ZONE_ID_DAYLIGHT: tzoff = (tz.Bias + tz.DaylightBias) * -60; break; } if (tzoff != orig_tzoff) tx = (time_t) difftime(tx, (time_t)(orig_tzoff - tzoff)); } #else if (tmx.tm_gmtoff != orig_tzoff) tx = difftime(tx, (time_t)(orig_tzoff - tmx.tm_gmtoff)); #endif return Scons(S_integer_time_t(tx), Svector_ref(dtvec, dtvec_nsec)); }