/* PsychGetBuildNumber() Returns a unique number with each build. */ int PsychGetBuildNumber(void) { int year, month, day, hour, minute, second; const char *buildDateStr, *buildTimeStr; //"Feb 12 1996" //"23:59:01" char monthStr[10]; //gcc just gives 3-letter abbr. but we don't know about all compilers". char *monthNames[]={"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"}; static int buildNumber; static boolean firstTime=TRUE; if(firstTime){ //first scan buildDateStr=PsychGetBuildDate(); buildTimeStr=PsychGetBuildTime(); sscanf(buildTimeStr,"%d:%d:%d",&hour,&minute,&second); //make sure this works with numbers beginning with "0". sscanf(buildDateStr,"%s %d %d", monthStr, &day, &year); for(month=0;month< 12;month++){ if(!strncmp(monthNames[month], monthStr,3)) break; else if(month==11) PsychErrorExitMsg(PsychError_internal, "failed to identify the macro constant specifying the month"); } buildNumber=second + minute*60 + hour *60*60 + day*24*60*60 + month*31*24*60*60 + (year - 2003)*12*31*24*60*60; firstTime=FALSE; } return(buildNumber); }
PsychError MODULEVersion(void) { int i; PsychAuthorDescriptorType *author; const char *versionFieldNames[]={"version", "major", "minor", "point", "build", "date", "time", "module", "project", "os", "language", "authors"}; const char *authorFiledNames[]={"first", "middle", "last", "initials", "email", "url"}; char *versionString; int buildNumber; int numVersionFieldDimensions=1, numVersionFieldNames=12, numAuthorFieldNames=6, numAuthors; PsychGenericScriptType *versionStructArray, *authorStructArray; //we ignore the usual usage help strings and create our own based on the module name. MODULEVersion() is for use by any Psychtoolbox module. char useString[256], synopsisString[256], *moduleName; char useStringP1[]="struct="; char useStringP2[]="('Version')"; char synopsisStringP1[]="return the version of "; char synopsisStringP2[]=" in a struct"; //for generic usage we modifiy at runtiome the help string to replace "Screen" with the name of this module. moduleName=PsychGetModuleName(); useString[0]='\0'; strcat(useString, useStringP1); strcat(useString, moduleName); strcat(useString, useStringP2); synopsisString[0]='\0'; strcat(synopsisString, synopsisStringP1); strcat(synopsisString, moduleName); strcat(synopsisString, synopsisStringP2); PsychPushHelp(useString, synopsisString, seeAlsoString); if(PsychIsGiveHelp()){PsychGiveHelp();return(PsychError_none);}; //check to see if the user supplied superfluous arguments PsychErrorExit(PsychCapNumOutputArgs(1)); PsychErrorExit(PsychCapNumInputArgs(0)); //get the build and version string buildNumber=PsychGetBuildNumber(); versionString=PsychGetVersionString(); //create a structure and populate it. PsychAllocOutStructArray(1, FALSE, numVersionFieldDimensions, numVersionFieldNames, versionFieldNames, &versionStructArray); PsychSetStructArrayStringElement("version", 0, versionString, versionStructArray); PsychSetStructArrayDoubleElement("major", 0, (double)PsychGetMajorVersionNumber(), versionStructArray); PsychSetStructArrayDoubleElement("minor", 0, (double)PsychGetMinorVersionNumber(), versionStructArray); PsychSetStructArrayDoubleElement("point", 0, (double)PsychGetPointVersionNumber(), versionStructArray); PsychSetStructArrayDoubleElement("build", 0, buildNumber, versionStructArray); PsychSetStructArrayStringElement("date", 0, PsychGetBuildDate(), versionStructArray); PsychSetStructArrayStringElement("time", 0, PsychGetBuildTime(), versionStructArray); PsychSetStructArrayStringElement("module", 0, moduleName, versionStructArray); PsychSetStructArrayStringElement("project", 0, PSYCHTOOLBOX_PROJECT_NAME, versionStructArray); PsychSetStructArrayStringElement("os", 0, PSYCHTOOLBOX_OS_NAME, versionStructArray); PsychSetStructArrayStringElement("language", 0, PSYCHTOOLBOX_SCRIPTING_LANGUAGE_NAME, versionStructArray); numAuthors=PsychGetNumModuleAuthors(); PsychAllocOutStructArray(-1, FALSE, numAuthors, numAuthorFieldNames, authorFiledNames, &authorStructArray); for(i=0;i<numAuthors;i++){ GetModuleAuthorDescriptorFromIndex(i, &author); PsychSetStructArrayStringElement("first", i, author->firstName, authorStructArray); PsychSetStructArrayStringElement("middle", i, author->middleName, authorStructArray); PsychSetStructArrayStringElement("last", i, author->lastName, authorStructArray); PsychSetStructArrayStringElement("initials", i, author->initials, authorStructArray); PsychSetStructArrayStringElement("email", i, author->email, authorStructArray); PsychSetStructArrayStringElement("url", i, author->url, authorStructArray); } PsychSetStructArrayStructElement("authors",0, authorStructArray, versionStructArray); return(PsychError_none); }