void GC_Object::SetName(const char *name) { if( CheckFlags(GC_FLAG_OBJECT_NAMED) ) { // // remove old name // assert(g_level->_objectToStringMaps[FastLog2(GC_FLAG_OBJECT_NAMED)].count(this)); const string_t &oldName = g_level->_objectToStringMaps[FastLog2(GC_FLAG_OBJECT_NAMED)][this]; assert(g_level->_nameToObjectMap.count(oldName)); g_level->_nameToObjectMap.erase(oldName); g_level->_objectToStringMaps[FastLog2(GC_FLAG_OBJECT_NAMED)].erase(this); // this invalidates oldName ref SetFlags(GC_FLAG_OBJECT_NAMED, false); } if( name && *name ) { // // set new name // assert( 0 == g_level->_objectToStringMaps[FastLog2(GC_FLAG_OBJECT_NAMED)].count(this) ); assert( 0 == g_level->_nameToObjectMap.count(name) ); g_level->_objectToStringMaps[FastLog2(GC_FLAG_OBJECT_NAMED)][this] = name; g_level->_nameToObjectMap[name] = this; SetFlags(GC_FLAG_OBJECT_NAMED, true); } }
dword TAP_EventHandler( word event, dword param1, dword param2 ) { dword returnKey = 0; returnKey = param1; switch(event) { case EVT_IDLE: My_IdleHandler(); break; case EVT_KEY: if ( param1 != 0 ) // means another TAP as exited the normal state { returnKey = My_KeyHandler(param1, param2); CheckFlags(); } break; default: break; } return (returnKey); }
int main(int argc, char **argv) { char tvalue = '\0', *key = calloc(ARGLENGTH, sizeof(char)), *parse = calloc(10, sizeof(char)), *fileName = calloc(ARGLENGTH, sizeof(char)), **wordList; tvalue = ParseArgs(argc, argv); key = argv[optind]; fileName = argv[optind + 1]; if (optind == argc || argc < 2) { fprintf(stderr, "usage: look [-dfa] [-t char] string [file]\n"); exit(EXIT_FAILURE); } else if (optind + 1 == argc) { fileName = "/usr/share/dict/words"; argFlags[0] = 1; argFlags[1] = 1; } key = CheckFlags(key, tvalue); ParseFile(argv, &parse, fileName); wordList = MakeList(parse); PrintResults(wordList, key, tvalue); return EXIT_SUCCESS; }
int FindFirst(char **wordList, int mid, char *key, char tvalue) { int count = -1, noMatch = 0, stringIndex = 0; char *firstWord, *temp = calloc(5, sizeof(char)); for (count = 1; mid + count > 0; count--) { temp = realloc(temp, strlen(wordList[mid + count]) + 1 * sizeof(char)); strcpy(temp, wordList[mid + count]); firstWord = strtok(temp, " "); firstWord = CheckFlags(firstWord, tvalue); noMatch = 0; stringIndex = 0; while(firstWord[stringIndex] != '\0' && key[stringIndex] != '\0') { if (firstWord[stringIndex] != key[stringIndex]) { noMatch = 1; break; } stringIndex++; } if (firstWord[stringIndex] == '\0' && key[stringIndex] != '\0') { noMatch = 1; } if (noMatch) { return mid + count + 1; } } return mid; }
int FindKey(char **wordList, char *key, char tvalue) { int start = 0, mid = (start + ListLength) / 2, count = 0; char *firstWord, *temp = calloc(5, sizeof(char)); while (start <= ListLength) { temp = realloc(temp, strlen(wordList[mid]) + 1 * sizeof(char)); strcpy(temp, wordList[mid]); firstWord = strtok(temp, " "); count = 0; argFlags[2] = 0; firstWord = CheckFlags(firstWord, tvalue); if (!strcmp(firstWord, key)) { return FindFirst(wordList, mid, key, tvalue); } else if (strcmp(firstWord, key) < 0){ start = mid + 1; } else if (strcmp(firstWord, key) > 0) { ListLength = mid - 1; } mid = (start + ListLength) / 2; } return FindFirst(wordList, mid, key, tvalue); }
const char* GC_Object::GetName() const { if( CheckFlags(GC_FLAG_OBJECT_NAMED) ) { assert( g_level->_objectToStringMaps[FastLog2(GC_FLAG_OBJECT_NAMED)].count(this) ); return g_level->_objectToStringMaps[FastLog2(GC_FLAG_OBJECT_NAMED)][this].c_str(); } return NULL; }
HRESULT Library_corlib_native_System_Reflection_MethodBase::get_IsPublic___BOOLEAN( CLR_RT_StackFrame& stack ) { NATIVE_PROFILE_CLR_CORE(); TINYCLR_HEADER(); TINYCLR_SET_AND_LEAVE(CheckFlags( stack, CLR_RECORD_METHODDEF::MD_Scope_Mask, CLR_RECORD_METHODDEF::MD_Scope_Public )); TINYCLR_NOCLEANUP(); }
void Tank::Handle() { Update(); CheckFlags(); if (m_iTimeFiring > BULLET_CREATION_TIME && m_bShoot) { m_oBulletHandle->New( m_fPosX + (30 * cos((m_glSurfaceTurret.rotation - 90) * (PI / 180.0f))), m_fPosY + (30 * sin((m_glSurfaceTurret.rotation - 90) * (PI / 180.0f))), m_glSurfaceTurret.rotation); m_iTimeFiring = 0; } m_oBulletHandle->Handle(); Collision(); if (m_iTimeTraveled > TREAD_CREATION_TIME) { //at some point we will meet a condition where we need //to spawn a treadmark //after we spawn a treadmark //that new object that is created //will be linked to the tank because it was created by it //but the object would "turn itself off" given a condition it would //meet internally //ie: tank is moving and gains a total distance of 100 units //the tank then spawns a treadmark //the tank keeps moving and will continue to spawn a treadmark every 100 units //the treadmark itself on creation would begin it's own internal "counter/timer/distancetraveled" //then undraw itself once it meets that condition //usage example: //tank.move(); //if(tank.distance > 100) //for i 10 x //{ //tank.spawntreadmark(initial + offset); //} //do other stuff //tank.spawntreadmark() //{ if(this->timer > 0) //draw(treadmarkTexture) //} m_oTreadMarks->New( m_fPosX + ((m_glSurfaceBase.w - 35) * cos((m_glSurfaceBase.rotation + 45) * (PI / 180.0f))), m_fPosY + ((m_glSurfaceBase.h - 33) * sin((m_glSurfaceBase.rotation + 45) * (PI / 180.0f))), m_glSurfaceBase.rotation); m_oTreadMarks->New( m_fPosX + ((m_glSurfaceBase.w - 35) * cos((m_glSurfaceBase.rotation - 225) * (PI / 180.0f))), m_fPosY + ((m_glSurfaceBase.h - 33) * sin((m_glSurfaceBase.rotation - 225) * (PI / 180.0f))), m_glSurfaceBase.rotation); m_iTimeTraveled = 0; } }
khm_int32 GetFlags(void) { CheckFlags(); return ((sort && sort_increasing)? KHUI_CW_COL_SORT_INC : 0) | ((sort && !sort_increasing)? KHUI_CW_COL_SORT_DEC : 0) | ((group)? KHUI_CW_COL_GROUP : 0) | ((fixed_width)? KHUI_CW_COL_FIXED_WIDTH : 0) | ((fixed_position)? KHUI_CW_COL_FIXED_POS : 0) | ((filler)? KHUI_CW_COL_FILLER : 0); }
void SetFlags(khm_int32 f) { sort = !!(f & (KHUI_CW_COL_SORT_INC | KHUI_CW_COL_SORT_DEC | KHUI_CW_COL_GROUP)); sort_increasing = ((f & KHUI_CW_COL_SORT_INC) || ((f & KHUI_CW_COL_GROUP) && !(f & KHUI_CW_COL_SORT_DEC))); group = !!(f & KHUI_CW_COL_GROUP); fixed_width = !!(f & KHUI_CW_COL_FIXED_WIDTH); fixed_position = !!(f & KHUI_CW_COL_FIXED_POS); filler = !!(f & KHUI_CW_COL_FILLER); CheckFlags(); }
void CPUWrapper::TestJump(int opcode) { if (testType == IMM_8) { lastImm8Arg = processor->ReadImm8Arg(); } else if (testType == IMM_16) { lastImm16Arg = processor->ReadImm16Arg(); } Instruction *instruction = processor->instructions[opcode]; instruction->Call(); assert(instruction->GetDuration() == expectedCyclesVarying); assert(PC() == expectedPC); CheckFlags(); }
void CPUWrapper::TestInstruction(int opcode) { ushort oldPC = PC(); if (testType == IMM_8) { lastImm8Arg = processor->ReadImm8Arg(); } else if (testType == IMM_16) { lastImm16Arg = processor->ReadImm16Arg(); } Instruction *instruction = processor->instructions[opcode]; instruction->Call(); assert(instruction->GetDuration() == expectedCycles[opcode]); assert(oldPC + expectedPCAdvance[opcode] == PC()); CheckFlags(); }
/************************************************* ITU0同期割り込み関数 -------------------------------------------------- * H8外部クロック25MHz * 100Hzで割り込み発生 * **************************************************/ void INT_IMIA1(void) { unsigned char i; //生存信号 if(itu1_cnt % ALV_PERIOD == 0) SetFlags(flag_alive); // AD変換,マルチプレクサスイッチング // if((itu1_cnt % DIV_AD) % DIV_MPX == 0 && (itu1_cnt % DIV_AD) <=35){ // DIV_AD/10 * 7 if((itu1_cnt % DIV_AD) % DIV_MPX == 0 && (itu1_cnt % DIV_AD) <=70){ // DIV_AD/10 * 7 SetFlags(flag_ad); } // AD変換結果表示 if(itu1_cnt % DIV_AD == 0) SetFlags(flag_dispAD); //コマンド実行 if(itu1_cnt % DIV_EXE == 0) SetFlags(flag_exe); //渦電流検知テレメトリ if(itu1_cnt % DIV_OVERAMPARE == 0) SetFlags(flag_overa); // 粗テレメトリ if(itu1_cnt % DIV_ROUGHTELEME == 0) SetFlags(flag_rteleme); // 詳細テレメトリ if(itu1_cnt % DIV_DETAILEDTELEME == 0) SetFlags(flag_dteleme); // APIテレメトリ if(itu1_cnt % DIV_APITELEME == 0) SetFlags(flag_ateleme); // 初期化情報テレメトリ if(itu1_cnt % DIV_ITELEME == 0) SetFlags(flag_iteleme); // パワーテレメトリ if(itu1_cnt % DIV_PTELEME == 0) SetFlags(flag_pwrt); // ミッションテレメトリ if(itu1_cnt % DIV_MTELEME == 0) SetFlags(flag_misst); // シリアル通信メッセージチェック if(itu1_cnt % DIV_MESSAGE == 0) SetFlags(flag_scirx); // RXチェック if(itu1_cnt % DIV_RX == 0) SetFlags(flag_rx); // TXチェック if(itu1_cnt % DIV_TX == 0) SetFlags(flag_tx); //パワーから返事が返って来ているかの確認 if(itu1_cnt % DIV_CPR == 0) SetFlags(flag_cpr); // 試験用テレメトリ出力 if(itu1_cnt % DIV_OUTPUTTELEME == 0) SetFlags(flag_oteleme); //ミッションCPU起動(タイマ予約型、タイマ予約&作動時間指定型) if((smr_time>0)&&(itu1_cnt > smr_time)){ SetFlags(flag_smr); } //ミッションCPUシャットダウン(タイマ予約&作動時間指定型) if((sms_time>0)&&(itu1_cnt > sms_time)){ SetFlags(flag_sms); } //PICオン要求 if(itu1_cnt % DIV_PIC == 0) SetFlags(flag_pic); /*デバッグ用*/ mission_cnt=itu1_cnt; itu1_cnt++; if(itu1_cnt >= 0xFFFFFFFE) // 0.001*4294967296(sec) = 500(day)でクリア { itu1_cnt = 0; } if(CheckFlags(ena_mywdt)){ my_wdt++; // main loopでクリア if(my_wdt >= OVERFLOW) RequestMainShutdown(); // 自己リセット要求 } status.obctime[3] = itu1_cnt & 0x00ff; status.obctime[2] = (itu1_cnt >> 8) & 0x00ff; status.obctime[1] = (itu1_cnt >> 16) & 0x00ff; status.obctime[0] = (itu1_cnt >> 24) & 0x00ff; ITU.TISRA.BIT.IMFA1 = 0; // 割り込みステータスフラグクリア }
void GC_Object::Serialize(SaveFile &f) { assert(0 == _notifyProtectCount); f.Serialize(_flags); // // name // if( CheckFlags(GC_FLAG_OBJECT_NAMED) ) { if( f.loading() ) { string_t name; f.Serialize(name); assert( 0 == g_level->_objectToStringMaps[FastLog2(GC_FLAG_OBJECT_NAMED)].count(this) ); assert( 0 == g_level->_nameToObjectMap.count(name) ); g_level->_objectToStringMaps[FastLog2(GC_FLAG_OBJECT_NAMED)][this] = name; g_level->_nameToObjectMap[name] = this; } else { string_t name = GetName(); f.Serialize(name); } } // // events // if( f.loading() ) { DWORD tmp = _flags & GC_FLAG_OBJECT_EVENTS_TS_FIXED; SetFlags(GC_FLAG_OBJECT_EVENTS_TS_FIXED, false); SetEvents(tmp); } // // notifications // size_t count = 0; if( const Notify *n = _firstNotify ) do { count += !n->IsRemoved(); } while( n = n->next ); f.Serialize(count); if( f.loading() ) { assert(NULL == _firstNotify); for( size_t i = 0; i < count; i++ ) { _firstNotify = new Notify(_firstNotify); _firstNotify->Serialize(f); } } else { for( Notify *n = _firstNotify; n; n = n->next ) { if( !n->IsRemoved() ) n->Serialize(f); } } }
// This is converting DAT Winpilot int ParseDAT(TCHAR *String,WAYPOINT *Temp) { TCHAR ctemp[(COMMENT_SIZE*2)+1]; // 101102 BUGFIX, we let +1 for safety TCHAR *Number; TCHAR *pWClast = NULL; TCHAR *pToken; TCHAR TempString[READLINE_LENGTH]; _tcscpy(TempString, String); // 20060513:sgi added wor on a copy of the string, do not modify the // source string, needed on error messages Temp->Visible = true; // default all waypoints visible at start Temp->FarVisible = true; Temp->Format = LKW_DAT; Temp->FileNum = globalFileNum; // ExtractParameter(TempString,ctemp,0); if ((pToken = _tcstok_r(TempString, TEXT(","), &pWClast)) == NULL) return FALSE; Temp->Number = _tcstol(pToken, &Number, 10); //ExtractParameter(TempString,ctemp,1); //Latitude if ((pToken = _tcstok_r(NULL, TEXT(","), &pWClast)) == NULL) return FALSE; Temp->Latitude = CalculateAngle(pToken); if((Temp->Latitude > 90) || (Temp->Latitude < -90)) { return FALSE; } //ExtractParameter(TempString,ctemp,2); //Longitude if ((pToken = _tcstok_r(NULL, TEXT(","), &pWClast)) == NULL) return FALSE; Temp->Longitude = CalculateAngle(pToken); if((Temp->Longitude > 180) || (Temp->Longitude < -180)) { return FALSE; } //ExtractParameter(TempString,ctemp,3); //Altitude if ((pToken = _tcstok_r(NULL, TEXT(","), &pWClast)) == NULL) return FALSE; Temp->Altitude = ReadAltitude(pToken); if (Temp->Altitude == -9999){ return FALSE; } //ExtractParameter(TempString,ctemp,4); //Flags if ((pToken = _tcstok_r(NULL, TEXT(","), &pWClast)) == NULL) return FALSE; Temp->Flags = CheckFlags(pToken); //ExtractParameter(TempString,ctemp,5); // Name if ((pToken = _tcstok_r(NULL, TEXT(",\n\r"), &pWClast)) == NULL) return FALSE; // guard against overrun if (_tcslen(pToken)>NAME_SIZE) { pToken[NAME_SIZE-1]= _T('\0'); } _tcscpy(Temp->Name, pToken); int i; for (i=_tcslen(Temp->Name)-1; i>1; i--) { if (Temp->Name[i]==' ') { Temp->Name[i]=0; } else { break; } } //ExtractParameter(TempString,ctemp,6); // Comment // DAT Comment if ((pToken = _tcstok_r(NULL, TEXT("\n\r"), &pWClast)) != NULL){ LK_tcsncpy(ctemp, pToken, COMMENT_SIZE); //@ 101102 BUGFIX bad. ctemp was not sized correctly! if (_tcslen(ctemp) >0 ) { if (Temp->Comment) { free(Temp->Comment); } Temp->Comment = (TCHAR*)malloc((_tcslen(ctemp)+1)*sizeof(TCHAR)); if (Temp->Comment) _tcscpy(Temp->Comment, ctemp); } } else { Temp->Comment = NULL; // useless } if(Temp->Altitude <= 0) { WaypointAltitudeFromTerrain(Temp); } if (Temp->Details) { free(Temp->Details); } return TRUE; }
virtual int GetType() { return CheckFlags(VMENU_COMBOBOX)?MODALTYPE_COMBOBOX:MODALTYPE_VMENU; }
/** * @brief Parses a brush from the map file * @sa FindMiptex * @param[in] mapent The entity the brush to parse belongs to * @param[in] filename The map filename, used to derive the name for the footsteps file */ static void ParseBrush (entity_t* mapent, const char* filename) { int j, k; brush_texture_t td; vec3_t planepts[3]; const int checkOrFix = config.performMapCheck || config.fixMap ; if (nummapbrushes == MAX_MAP_BRUSHES) Sys_Error("nummapbrushes == MAX_MAP_BRUSHES (%i)", nummapbrushes); mapbrush_t* b = &mapbrushes[nummapbrushes]; OBJZERO(*b); b->original_sides = &brushsides[nummapbrushsides]; b->entitynum = num_entities - 1; b->brushnum = nummapbrushes - mapent->firstbrush; do { if (Q_strnull(GetToken())) break; if (*parsedToken == '}') break; if (nummapbrushsides == MAX_MAP_BRUSHSIDES) Sys_Error("nummapbrushsides == MAX_MAP_BRUSHSIDES (%i)", nummapbrushsides); side_t* side = &brushsides[nummapbrushsides]; /* read the three point plane definition */ for (int i = 0; i < 3; i++) { if (i != 0) GetToken(); if (*parsedToken != '(') Sys_Error("parsing brush"); for (j = 0; j < 3; j++) { GetToken(); planepts[i][j] = atof(parsedToken); } GetToken(); if (*parsedToken != ')') Sys_Error("parsing brush"); } /* read the texturedef */ GetToken(); if (strlen(parsedToken) >= MAX_TEXPATH) { if (config.performMapCheck || config.fixMap) Com_Printf(" ");/* hack to make this look like output from Check_Printf() */ Com_Printf("ParseBrush: texture name too long (limit %i): %s\n", MAX_TEXPATH, parsedToken); if (config.fixMap) Sys_Error("Aborting, as -fix is active and saving might corrupt *.map by truncating texture name"); } Q_strncpyz(td.name, parsedToken, sizeof(td.name)); td.shift[0] = atof(GetToken()); td.shift[1] = atof(GetToken()); td.rotate = atof(GetToken()); td.scale[0] = atof(GetToken()); td.scale[1] = atof(GetToken()); /* find default flags and values */ const int mt = FindMiptex(td.name); side->surfaceFlags = td.surfaceFlags = side->contentFlags = td.value = 0; if (TokenAvailable()) { side->contentFlags = atoi(GetToken()); side->surfaceFlags = td.surfaceFlags = atoi(GetToken()); td.value = atoi(GetToken()); } /* if in check or fix mode, let them choose to do this (with command line options), * and then call is made elsewhere */ if (!checkOrFix) { SetImpliedFlags(side, &td, b); /* if no other content flags are set - make this solid */ if (!checkOrFix && side->contentFlags == 0) side->contentFlags = CONTENTS_SOLID; } /* translucent objects are automatically classified as detail and window */ if (side->surfaceFlags & (SURF_BLEND33 | SURF_BLEND66 | SURF_ALPHATEST)) { side->contentFlags |= CONTENTS_DETAIL; side->contentFlags |= CONTENTS_TRANSLUCENT; side->contentFlags |= CONTENTS_WINDOW; side->contentFlags &= ~CONTENTS_SOLID; } if (config.fulldetail) side->contentFlags &= ~CONTENTS_DETAIL; if (!checkOrFix) { if (!(side->contentFlags & ((LAST_VISIBLE_CONTENTS - 1) | CONTENTS_ACTORCLIP | CONTENTS_WEAPONCLIP | CONTENTS_LIGHTCLIP))) side->contentFlags |= CONTENTS_SOLID; /* hints and skips are never detail, and have no content */ if (side->surfaceFlags & (SURF_HINT | SURF_SKIP)) { side->contentFlags = 0; side->surfaceFlags &= ~CONTENTS_DETAIL; } } /* check whether the flags are ok */ CheckFlags(side, b); /* generate a list of textures that should have footsteps when walking on them */ if (mt > 0 && (side->surfaceFlags & SURF_FOOTSTEP)) GenerateFootstepList(filename, mt); GenerateMaterialFile(filename, mt, side); /* find the plane number */ int planenum = PlaneFromPoints(b, planepts[0], planepts[1], planepts[2]); if (planenum == PLANENUM_LEAF) { Com_Printf("Entity %i, Brush %i: plane with no normal\n", b->entitynum, b->brushnum); continue; } for (j = 0; j < 3; j++) VectorCopy(planepts[j], mapplanes[planenum].planeVector[j]); /* see if the plane has been used already */ for (k = 0; k < b->numsides; k++) { const side_t* s2 = b->original_sides + k; if (s2->planenum == planenum) { Com_Printf("Entity %i, Brush %i: duplicate plane\n", b->entitynum, b->brushnum); break; } if (s2->planenum == (planenum ^ 1)) { Com_Printf("Entity %i, Brush %i: mirrored plane\n", b->entitynum, b->brushnum); break; } } if (k != b->numsides) continue; /* duplicated */ /* keep this side */ side = b->original_sides + b->numsides; side->planenum = planenum; side->texinfo = TexinfoForBrushTexture(&mapplanes[planenum], &td, vec3_origin, side->contentFlags & CONTENTS_TERRAIN); side->brush = b; /* save the td off in case there is an origin brush and we * have to recalculate the texinfo */ side_brushtextures[nummapbrushsides] = td; Verb_Printf(VERB_DUMP, "Brush %i Side %i (%f %f %f) (%f %f %f) (%f %f %f) texinfo:%i[%s] plane:%i\n", nummapbrushes, nummapbrushsides, planepts[0][0], planepts[0][1], planepts[0][2], planepts[1][0], planepts[1][1], planepts[1][2], planepts[2][0], planepts[2][1], planepts[2][2], side->texinfo, td.name, planenum); nummapbrushsides++; b->numsides++; } while (1); /* get the content for the entire brush */ b->contentFlags = BrushContents(b); /* copy all set face contentflags to the brush contentflags */ for (int m = 0; m < b->numsides; m++) b->contentFlags |= b->original_sides[m].contentFlags; /* set DETAIL, TRANSLUCENT contentflags on all faces, if they have been set on any. * called separately, if in check/fix mode */ if (!checkOrFix) CheckPropagateParserContentFlags(b); /* allow detail brushes to be removed */ if (config.nodetail && (b->contentFlags & CONTENTS_DETAIL)) { b->numsides = 0; return; } /* allow water brushes to be removed */ if (config.nowater && (b->contentFlags & CONTENTS_WATER)) { b->numsides = 0; return; } /* create windings for sides and bounds for brush */ MakeBrushWindings(b); Verb_Printf(VERB_DUMP, "Brush %i mins (%f %f %f) maxs (%f %f %f)\n", nummapbrushes, b->mbBox.mins[0], b->mbBox.mins[1], b->mbBox.mins[2], b->mbBox.maxs[0], b->mbBox.maxs[1], b->mbBox.maxs[2]); /* origin brushes are removed, but they set * the rotation origin for the rest of the brushes (like func_door) * in the entity. After the entire entity is parsed, the planenums * and texinfos will be adjusted for the origin brush */ if (!checkOrFix && (b->contentFlags & CONTENTS_ORIGIN)) { char string[32]; vec3_t origin; if (num_entities == 1) { Sys_Error("Entity %i, Brush %i: origin brushes not allowed in world" , b->entitynum, b->brushnum); return; } b->mbBox.getCenter(origin); Com_sprintf(string, sizeof(string), "%i %i %i", (int)origin[0], (int)origin[1], (int)origin[2]); SetKeyValue(&entities[b->entitynum], "origin", string); Verb_Printf(VERB_EXTRA, "Entity %i, Brush %i: set origin to %s\n", b->entitynum, b->brushnum, string); VectorCopy(origin, entities[b->entitynum].origin); /* don't keep this brush */ b->numsides = 0; return; } if (!checkOrFix) AddBrushBevels(b); nummapbrushes++; mapent->numbrushes++; }
int main(int argc, char **argv) { osFile fh; uint32_t total,areas,totaldupes; time_t firsttime,t; uint32_t DayStatsWritten; char buf[200],date[30],date2[30]; struct DiskAreaStats dastat; struct DiskNodeStats dnstat; struct StatsNode *sn; struct NodeStatsNode *nsn; struct jbList StatsList; struct jbList NodesList; uint32_t c,num,tot; uint16_t total8days[8]; char sortmode; struct tm *tp; char *monthnames[]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec","???"}; signal(SIGINT,breakfunc); if(!osInit()) exit(OS_EXIT_ERROR); if(argc > 1 && (strcmp(argv[1],"?")==0 || strcmp(argv[1],"-h")==0 || strcmp(argv[1],"--help")==0 || strcmp(argv[1],"help")==0 || strcmp(argv[1],"/h")==0 || strcmp(argv[1],"/?")==0 )) { printargs(args); osEnd(); exit(OS_EXIT_OK); } if(!parseargs(args,argc,argv)) { osEnd(); exit(OS_EXIT_ERROR); } sortmode='a'; if(args[ARG_SORT].data) sortmode=tolower(((char *)args[ARG_SORT].data)[0]); if(!strchr("amtdlu",sortmode)) { printf("Unknown sort mode %c\n",sortmode); osEnd(); exit(OS_EXIT_ERROR); } if(args[ARG_NOAREAS].data && args[ARG_NONODES].data) { printf("Nothing to do\n"); osEnd(); exit(OS_EXIT_ERROR); } printf("CrashStats "VERSION" © " COPYRIGHT " Johan Billing\n"); if(!(fh=osOpen(args[ARG_FILE].data,MODE_OLDFILE))) { uint32_t err=osError(); printf("Error opening %s\n",(char *)args[ARG_FILE].data); printf("Error: %s\n",osErrorMsg(err)); osEnd(); exit(OS_EXIT_ERROR); } osRead(fh,buf,4); buf[4]=0; if(strcmp(buf,STATS_IDENTIFIER)!=0) { printf("Unknown format of stats file\n"); osClose(fh); osEnd(); exit(OS_EXIT_ERROR); } osRead(fh,&DayStatsWritten,sizeof(uint32_t)); total=0; totaldupes=0; firsttime=0; areas=0; for(c=0;c<8;c++) total8days[c]=0; jbNewList(&StatsList); jbNewList(&NodesList); osRead(fh,&num,sizeof(uint32_t)); c=0; if(!args[ARG_NOAREAS].data) { while(c<num && osRead(fh,&dastat,sizeof(struct DiskAreaStats))==sizeof(struct DiskAreaStats)) { if(!args[ARG_GROUP].data || CheckFlags(dastat.Group,args[ARG_GROUP].data)) { if(!(sn=osAlloc(sizeof(struct StatsNode)))) { printf("Out of memory\n"); jbFreeList(&StatsList); osClose(fh); osEnd(); exit(OS_EXIT_ERROR); } jbAddNode(&StatsList,(struct jbNode *)sn); strcpy(sn->Tagname,dastat.Tagname); sn->Dupes=dastat.Dupes; sn->Total=dastat.TotalTexts; sn->FirstTime=dastat.FirstTime; sn->LastTime=dastat.LastTime; memcpy(&sn->Last8Days[0],&dastat.Last8Days[0],8*sizeof(uint16_t)); sn->Average=CalculateAverage(&dastat.Last8Days[0],dastat.TotalTexts,DayStatsWritten,sn->FirstTime / (24*60*60)); } if(dastat.FirstTime!=0) if(firsttime==0 || firsttime > dastat.FirstTime) firsttime=dastat.FirstTime; c++; } } else { while(c<num && osRead(fh,&dastat,sizeof(struct DiskAreaStats))==sizeof(struct DiskAreaStats)) c++; } osRead(fh,&num,sizeof(uint32_t)); c=0; if(!args[ARG_NONODES].data) { while(c<num && osRead(fh,&dnstat,sizeof(struct DiskNodeStats))==sizeof(struct DiskNodeStats)) { if(!(nsn=osAlloc(sizeof(struct NodeStatsNode)))) { printf("Out of memory\n"); jbFreeList(&NodesList); jbFreeList(&StatsList); osClose(fh); osEnd(); exit(OS_EXIT_ERROR); } jbAddNode(&NodesList,(struct jbNode *)nsn); Copy4D(&nsn->Node,&dnstat.Node); nsn->GotNetmails=dnstat.GotNetmails; nsn->GotNetmailBytes=dnstat.GotNetmailBytes; nsn->SentNetmails=dnstat.SentNetmails; nsn->SentNetmailBytes=dnstat.SentNetmailBytes; nsn->GotEchomails=dnstat.GotEchomails; nsn->GotEchomailBytes=dnstat.GotEchomailBytes; nsn->SentEchomails=dnstat.SentEchomails; nsn->SentEchomailBytes=dnstat.SentEchomailBytes; nsn->Dupes=dnstat.Dupes; nsn->Days=DayStatsWritten-dnstat.FirstTime % (24*60*60); if(nsn->Days==0) nsn->Days=1; nsn->FirstTime=dnstat.FirstTime; if(dnstat.FirstTime!=0) if(firsttime==0 || firsttime > dnstat.FirstTime) firsttime=dnstat.FirstTime; c++; } } else { while(c<num && osRead(fh,&dnstat,sizeof(struct DiskNodeStats))==sizeof(struct DiskNodeStats)) c++; } osClose(fh); t=(time_t)DayStatsWritten * 24*60*60; tp=localtime(&firsttime); sprintf(date,"%02d-%s-%02d",tp->tm_mday,monthnames[tp->tm_mon],tp->tm_year%100); tp=localtime(&t); sprintf(date2,"%02d-%s-%02d",tp->tm_mday,monthnames[tp->tm_mon],tp->tm_year%100); printf("\nStatistics from %s to %s\n",date,date2); if(!ctrlc && !args[ARG_NOAREAS].data) { Sort(&StatsList,'a'); Sort(&StatsList,sortmode); printf("\n"); if(args[ARG_LAST7].data) { printf("Area "); for(c=1;c<8;c++) { t=(DayStatsWritten-c)*24*60*60; tp=localtime(&t); printf(" %02d",tp->tm_mday); } printf(" Total\n============================================================================\n"); if(!ctrlc) { for(sn=(struct StatsNode *)StatsList.First;sn && !ctrlc;sn=sn->Next) { tot=0; for(c=1;c<8;c++) tot+=sn->Last8Days[c]; printf("%-33.33s %4d %4d %4d %4d %4d %4d %4d : %5d\n", sn->Tagname, sn->Last8Days[1], sn->Last8Days[2], sn->Last8Days[3], sn->Last8Days[4], sn->Last8Days[5], sn->Last8Days[6], sn->Last8Days[7], tot); for(c=1;c<8;c++) total8days[c]+=sn->Last8Days[c]; areas++; } if(!ctrlc) { tot=0; for(c=1;c<8;c++) tot+=total8days[c]; printf("=============================================================================\n"); sprintf(buf,"Totally in all %u areas",areas); printf("%-33.33s %4d %4d %4d %4d %4d %4d %4d : %5d\n", buf, total8days[1], total8days[2], total8days[3], total8days[4], total8days[5], total8days[6], total8days[7], tot); } } } else { printf("Area First Last Msgs Msgs/day Dupes\n"); printf("============================================================================\n"); if(!ctrlc) { for(sn=(struct StatsNode *)StatsList.First;sn && !ctrlc;sn=sn->Next) { if(sn->LastTime==0) { strcpy(date2,"<Never>"); } else { tp=localtime(&sn->LastTime); sprintf(date2,"%02d-%s-%02d",tp->tm_mday,monthnames[tp->tm_mon],tp->tm_year%100); } if(sn->FirstTime==0) { strcpy(date,"<Never>"); } else { tp=localtime(&sn->FirstTime); sprintf(date,"%02d-%s-%02d",tp->tm_mday,monthnames[tp->tm_mon],tp->tm_year%100); } for(c=0;c<8;c++) total8days[c]+=sn->Last8Days[c]; total+=sn->Total; totaldupes+=sn->Dupes; areas++; printf("%-29.30s %-9.9s %-9.9s %7d %7d %7d\n",sn->Tagname,date,date2,sn->Total,sn->Average,sn->Dupes); } } if(!ctrlc) { printf("============================================================================\n"); sprintf(buf,"Totally in all %u areas",areas); printf("%-42s %7d %7d %7d\n", buf, total, CalculateAverage(&total8days[0],total,DayStatsWritten,firsttime / (24*60*60)), totaldupes); } } } if(!ctrlc && !args[ARG_NONODES].data) { SortNodes(&NodesList); printf("\n"); printf("Nodes statistics\n"); printf("================\n"); for(nsn=(struct NodeStatsNode *)NodesList.First;nsn && !ctrlc;nsn=nsn->Next) { if(nsn->FirstTime==0) { strcpy(date,"<Never>"); } else { tp=localtime(&nsn->FirstTime); sprintf(date,"%0d-%s-%0d",tp->tm_mday,monthnames[tp->tm_mon],tp->tm_year%100); } sprintf(buf,"%u:%u/%u.%u",nsn->Node.Zone,nsn->Node.Net,nsn->Node.Node,nsn->Node.Point); printf("%-30.40s Statistics since: %s\n\n",buf,date); printf(" Sent netmails: %u/%s\n",nsn->SentNetmails,unit(nsn->SentNetmailBytes)); printf(" Received netmails: %u/%s\n",nsn->GotNetmails,unit(nsn->GotNetmailBytes)); printf(" Sent echomails: %u/%s\n",nsn->SentEchomails,unit(nsn->SentEchomailBytes)); printf(" Received echomails: %u/%s\n",nsn->GotEchomails,unit(nsn->GotEchomailBytes)); printf(" Dupes: %u\n",nsn->Dupes); printf("\n"); } } if(ctrlc) { printf("*** Break\n"); } else { printf("\n"); } jbFreeList(&StatsList); jbFreeList(&NodesList); osEnd(); exit(OS_EXIT_OK); }