/* _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ ã€æ©Ÿèƒ½æ¦‚è¦ã€‘ : C++言語関連ã§ä½¿ç”¨ã™ã‚‹å…±é€šé–¢æ•°ç¾¤ 本アプリã§å®Ÿè£…ã—ã¦ã„る共通関数ã¯ã€ä»¥ä¸‹ã®é€šã‚Š 使用方法ã«ã¤ã„ã¦ã¯ã€å„関数ã®å®Ÿè£…部ã§è¨˜è¿° ã€ä½œæˆæ—¥ã€‘ : 2021.04.23 ã€å®Ÿè£…関数】 : getLocalTimeString # ç¾åœ¨æ™‚刻ã®å–å¾—ã¨æŒ‡å®šãƒ•ã‚©ãƒ¼ãƒžãƒƒãƒˆåŒ– : strnumber # int型数値を文å—列ã«å¤‰æ› : ExpandEnvironmentStrings # æ–‡å—列ä¸ã‹ã‚‰ç’°å¢ƒå¤‰æ•°å®šç¾©éƒ¨ã‚’展開ã—ã¦çµæžœã‚’è¿”å´ : getEnvString # 環境変数charåž‹è¿”å´ï¼ˆåˆæœŸå€¤è¨å®šä»˜ã) : getEnvLong # 環境変数Longåž‹è¿”å´ï¼ˆåˆæœŸå€¤è¨å®šä»˜ã) : strtokEX # strtokã®æ‹¡å¼µç‰ˆã€["],['],[()]ã«ã‚ˆã‚‹åŒºåˆ‡ã‚Šä¿è·ãŒå¯èƒ½ : strTrim # æ–‡å—列ã®å‰å¾ŒåŠè§’スペースをトリムã™ã‚‹ : strLTrim # æ–‡å—列ã®å‰éƒ¨åŠè§’スペースをトリムã™ã‚‹ : startLock # 排他ãƒãƒƒã‚¯ã‚’開始ã™ã‚‹ : endLock # 排他ãƒãƒƒã‚¯ã‚’解除ã™ã‚‹ : initLock # 排他ãƒãƒƒã‚¯ã‚’åˆæœŸåŒ–ã™ã‚‹ _/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/ */ #include "compatible_function.h" #ifndef WIN32 pthread_mutex_t mutex [ maxMutexLock ] ; // mutexãƒãƒƒã‚¯ï¼ˆunix) #else HANDLE hMutex [ maxMutexLock ] ; // mutexãƒãƒƒã‚¯ï¼ˆwin・但ã—ã€windowsã¯æœªå®Ÿè£…箇所ã‚り) #endif int mutexCount = 0 ; // mutexãƒãƒƒã‚¯æ•° //******************************************************************************* //* getLocalTimeString関数 * //******************************************************************************* //* ç¾åœ¨ã®ãƒãƒ¼ã‚«ãƒ«æ™‚刻をå–å¾—ã—指定フォーマットã«ã‚ã‚ã›ã¦æ–‡å—列ã«å¤‰æ›ã™ã‚‹ //* parameter O cOutputString :出力ãƒãƒƒãƒ•ã‚¡ //* I maxStringSize :出力ãƒãƒƒãƒ•ã‚¡é•· //* I cFormatString :æ›¸å¼ //* return 0以上 :æ–‡å—列変æ›æˆåŠŸï¼ˆæ–‡å—列長) //* 0 :æ–‡å—列変æ›å¤±æ•— //* -1 :時刻å–得失敗 //* 備考:使用ã§ãるフォーマット指定コードã¯ä»¥ä¸‹ã®é€šã‚Š //* %Y :10進数ã§è¡¨ã™4æ¡ã®è¥¿æš¦ //* %y :10進数ã§è¡¨ã™è¥¿æš¦ã®ä¸‹ 2 æ¡ (00〜99) //* %m :10進数ã§è¡¨ã™æœˆ (01〜12) //* %d :10進数ã§è¡¨ã™æœˆã®æ—¥ä»˜ (01〜31) //* %p :ç¾åœ¨ã®ãƒã‚±ãƒ¼ãƒ«ã® am/pm (å°æ–‡å—) //* %P :ç¾åœ¨ã®ãƒã‚±ãƒ¼ãƒ«ã® AM/PM (大文å—) //* %H :24時間表記ã®æ™‚é–“ (00〜23) //* %h :12時間表記ã®æ™‚é–“ (00〜11) //* %M :10進数ã§è¡¨ã™åˆ† (00〜59) //* %S :10進数ã§è¡¨ã™ç§’ (00〜59) //* %u :10進数ã§è¡¨ã™ãƒŸãƒªç§’(000〜999) //* %U :10進数ã§è¡¨ã™ãƒžã‚¤ã‚¯ãƒç§’(000000〜999999) //* %% :%è¨˜å· long getLocalTimeString( char * cOutputString, size_t maxStringSize, const char * cFormatString) { //変数定義 #ifdef WIN32 struct timeb tp; //ã‚·ã‚¹ãƒ†ãƒ æ™‚åˆ»æ ¼ç´ç”¨ #else struct timeval tp; //ã‚·ã‚¹ãƒ†ãƒ æ™‚åˆ»æ ¼ç´ç”¨ #endif struct tm *tmc; //æ™‚åˆ»æƒ…å ±å–得用 struct tm tmc_r; //æ™‚åˆ»æƒ…å ±å–得用(実体) long iMicroSec; //マイクãƒç§’æ ¼ç´ size_t szLeft; //未使用ã®å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡é•· int iTmp; // //ç¾åœ¨æ™‚刻å–å¾— // #ifdef WIN32 ftime(&tp); tmc = localtime_r ( &tp.time , &tmc_r ); iMicroSec = tp.millitm*1000; #else (void)gettimeofday( &tp,NULL ); tmc = localtime_r ( &tp.tv_sec , &tmc_r); iMicroSec = tp.tv_usec; #endif if(tmc == NULL){ return -1; } // //ç¾åœ¨æ™‚刻文å—åˆ—å¤‰æ› // szLeft = maxStringSize; //未使用出力ãƒãƒƒãƒ•ã‚¡é•·ã«å¼•æ•°ã®å‡ºåŠ›ãƒãƒƒãƒ•ã‚¡é•·ã‚’入れã¦åˆæœŸåŒ– while (szLeft > 0) { switch (*cFormatString){ case '\0': //書å¼çµ‚了時ã¯æ–‡å—列変æ›çµ‚了 goto done; case '%': //書å¼ã®å…ˆé æ–‡å—ã®å ´åˆã¯æ›¸å¼ã«ã‚ã‚ã›ã¦æ–‡å—åˆ—å¤‰æ› cFormatString++; switch (*cFormatString){ case 'd': strnumber(tmc->tm_mday,2,&cOutputString,&szLeft); break; case 'H': strnumber(tmc->tm_hour,2,&cOutputString,&szLeft); break; case 'h': if(tmc->tm_hour < 12){ strnumber(tmc->tm_hour,2,&cOutputString,&szLeft); } else{ strnumber(tmc->tm_hour-12,2,&cOutputString,&szLeft); } break; case 'p': if(tmc->tm_hour < 12){ * cOutputString = 'a'; *(cOutputString + 1) = 'm'; } else{ * cOutputString = 'p'; *(cOutputString + 1) = 'm'; } cOutputString += 2; break; case 'P': if(tmc->tm_hour < 12){ * cOutputString = 'A'; *(cOutputString + 1) = 'M'; } else{ * cOutputString = 'P'; *(cOutputString + 1) = 'M'; } cOutputString += 2; szLeft -= 2; break; case 'm': strnumber(tmc->tm_mon+1,2,&cOutputString,&szLeft); break; case 'M': strnumber(tmc->tm_min,2,&cOutputString,&szLeft); break; case 'S': strnumber(tmc->tm_sec,2,&cOutputString,&szLeft); break; case 'U': strnumber(iMicroSec,6,&cOutputString,&szLeft); break; case 'u': strnumber(iMicroSec / 1000,3,&cOutputString,&szLeft); break; case 'y': strnumber(tmc->tm_year % 100,2,&cOutputString,&szLeft); break; case 'Y': iTmp = (tmc->tm_year / 100 + 19) * 100 + tmc->tm_year % 100; strnumber(iTmp,4,&cOutputString,&szLeft); break; case '%': *cOutputString = '%'; cOutputString++; szLeft--; break; default : break; } cFormatString++; break; default: //ãã®ä»–ã®æ–‡å—ã¯ãã®ã¾ã¾å‡ºåŠ› *cOutputString = *cFormatString; cOutputString++; cFormatString++; szLeft--; } } done: if(szLeft > 0){ *cOutputString = '\0'; return (long)maxStringSize - (long)szLeft; } return 0; } //******************************************************************************* //* strnumber関数 * //******************************************************************************* //* 数値文å—列変æ›é–¢æ•°ï¼ˆgetLocalTimeStringã§ã®ã¿ä½¿ç”¨ï¼‰ //* parameter I num :入力数値 //* I digits :出力æ¡æ•° //* O out :出力ãƒãƒƒãƒ•ã‚¡ //* I/O count :出力ãƒãƒƒãƒ•ã‚¡å®¹é‡ï¼ˆæ®‹ãƒãƒƒãƒ•ã‚¡å®¹é‡ï¼‰ static void strnumber( int num, const int digits, char ** out, size_t * count) { int i; if(digits < (int)*count){ for (i = 1;(int)(digits - i) >=0 ; i++) { *(*out + digits - i) = '0' + num % 10; num = (num - num % 10) / 10; } count = count - digits; *out = *out + digits; } else{ *count = 0; } } #ifndef WIN32 //******************************************************************************* //* ExpandEnvironmentStrings関数 * //******************************************************************************* //* æ–‡å—列ä¸ã®ç’°å¢ƒå¤‰æ•°ã‚’展開ã™ã‚‹ï¼ˆwin32APIã‚’UNIXã§ã‚¨ãƒŸãƒ¥ãƒ¬ãƒ¼ãƒˆï¼‰ //* parameter I szInputBuffer :入力文å—列ãƒãƒƒãƒ•ã‚¡ //* O szOutputBuffer :出力文å—列ãƒãƒƒãƒ•ã‚¡ //* I nSize :出力ãƒãƒƒãƒ•ã‚¡é•· //* return 0以上 :æ–‡å—列変æ›æˆåŠŸï¼ˆæ–‡å—列長) //* 0 :æ–‡å—列変æ›å¤±æ•— int ExpandEnvironmentStrings( const char * szInputBuffer, char * szOutputBuffer, int nSize) { char * pszInputBuffer; char * pszTmpL; char * pszTmpR; char * pszEnv; //使用変数ã®åˆæœŸåŒ– pszInputBuffer = (char *)malloc(strlen(szInputBuffer)+1); strcpy(pszInputBuffer,szInputBuffer); *szOutputBuffer = '\0'; pszTmpL = pszInputBuffer; pszTmpR = strchr(pszTmpL,'$'); //環境変数ãŒç™ºè¦‹ã•ã‚Œãªããªã‚‹ã¾ã§ãƒ«ãƒ¼ãƒ— while(pszTmpR != NULL){ //環境変数開始ä½ç½®ã§æ–‡å—列を切り離㙠*pszTmpR = '\0'; //環境変数より左å´ã‚’出力ãƒãƒƒãƒ•ã‚¡ã«è¿½åŠ ã™ã‚‹ strncat(szOutputBuffer,pszTmpL,nSize); nSize -= strlen(pszTmpL); pszTmpR++; //$ã®å¾Œã‚ãŒæ‹¬å¼§ã®å ´åˆã¯æ‹¬å¼§ã®ä¸ã®æ–‡å—列を環境変数åã¨ã™ã‚‹ if(*pszTmpR=='('){ //環境変数åを抜ã出㙠pszTmpR++; pszTmpL = strchr(pszTmpR,')')+1; *(pszTmpL - 1) = '\0'; //環境変数ã‹ã‚‰æ–‡å—列をå–å¾— pszEnv = getenv(pszTmpR); if(pszEnv != NULL){ strncat(szOutputBuffer,pszEnv,nSize); nSize -= strlen(pszEnv); } } else{ //$ã®å¾Œã‚ãŒæ‹¬å¼§ã§ãªã„å ´åˆã¯/ã®ç›´å‰ã¾ã§ã‚’環境変数åã¨ã™ã‚‹ pszTmpL = strchr(pszTmpR,'/'); if(pszTmpL != NULL){ *pszTmpL = '\0'; *pszTmpL++; pszEnv = getenv(pszTmpR); if(pszEnv != NULL){ strncat(szOutputBuffer,pszEnv,nSize); nSize -= strlen(pszEnv); } strncat(szOutputBuffer,"/",nSize); nSize -= strlen("/"); } else{ //'/'ãŒæ–‡å—列ä¸ã«ãªã„å ´åˆã¯æ–‡å—列全体を環境変数åã¨ã™ã‚‹ pszEnv = getenv(pszTmpR); if(pszEnv != NULL){ strncat(szOutputBuffer,pszEnv,nSize); nSize -= strlen(pszEnv); } //çµ‚äº†å‡¦ç† free(pszInputBuffer); return strlen(szOutputBuffer); } } //次ã®ç’°å¢ƒå¤‰æ•°ã‚’検索ã™ã‚‹ pszTmpR = strchr(pszTmpL,'$'); } //残文å—列を出力ãƒãƒƒãƒ•ã‚¡ã«è¿½åŠ ã™ã‚‹ strncat(szOutputBuffer,pszTmpL,nSize); free(pszInputBuffer); return strlen(szOutputBuffer); } #endif //******************************************************************************* //* getEnvString関数 * //******************************************************************************* //* 環境変数をå–å¾—ã™ã‚‹ã€‚å–å¾—ã§ããªã„å ´åˆã¯åˆæœŸå€¤ã‚’出力ã™ã‚‹ //* parameter O outputBuffer :出力ãƒãƒƒãƒ•ã‚¡ //* I inputEnvName :入力環境変数å //* I DefaultString :åˆæœŸå€¤ //* I maxOutputSize :出力ãƒãƒƒãƒ•ã‚¡ã®ã‚µã‚¤ã‚º(NULLè¾¼ã¿) //* return 0以上 :æ–‡å—列変æ›æˆåŠŸï¼ˆæ–‡å—列長) //* 0 :æ–‡å—列変æ›å¤±æ•— int getEnvString( char * outputBuffer, const char * inputEnvName, const char * DefaultString, int maxOutputSize) { char * pszEnv; //環境変数 pszEnv = getenv(inputEnvName); //環境変数より文å—列をå–å¾— if(pszEnv != NULL){ return ExpandEnvironmentStrings(pszEnv,outputBuffer,maxOutputSize); } else{ //å–å¾—ã§ããªã‹ã£ãŸå ´åˆã¯åˆæœŸå€¤ã‚’出力 return ExpandEnvironmentStrings(DefaultString,outputBuffer,maxOutputSize); } } //******************************************************************************* //* getEnvLong関数 * //******************************************************************************* //* 環境変数をå–å¾—ã™ã‚‹ã€‚å–å¾—ã§ããªã„å ´åˆã¯åˆæœŸå€¤ã‚’出力ã™ã‚‹ //* parameter I inputEnvName :入力環境変数å //* I DefaultString :åˆæœŸå€¤ //* return :å–å¾—ã—ãŸæ•°å€¤ long getEnvLong( const char * inputEnvName, const long DefaultData) { char * pszEnv; //環境変数 pszEnv = getenv(inputEnvName); //環境変数より文å—列をå–å¾— if(pszEnv != NULL){ return strtol(pszEnv,NULL,0); } else{ //å–å¾—ã§ããªã‹ã£ãŸå ´åˆã¯åˆæœŸå€¤ã‚’出力 return DefaultData; } } //******************************************************************************* //* strtokEX関数 * //******************************************************************************* //* æ–‡å—列を指定ã•ã‚ŒãŸæ–‡å—ã§åŒºåˆ‡ã‚Šã€ãƒˆãƒ¼ã‚¯ãƒ³ã‚’切り出㙠//* parameter I/O pcStartString :入力文å—列ãƒãƒƒãƒ•ã‚¡(切り出ã—後ã®æ®‹ã‚Šãƒãƒƒãƒ•ã‚¡) //* I pcTokenSep :åˆæœŸå€¤ //* I iOption :オプション(オプションåŒå£«ã‚’ANDã§çµ„ã¿åˆã‚ã›å¯èƒ½) //* return :切り出ã—ãŸæ–‡å—列 //* 備考:オプションã¯ä»¥ä¸‹ã®é€šã‚Š //* 1 :"〜"ã®éƒ¨åˆ†ã‚’1ã¤ã®æ–‡å—列ã¨ã—ã¦èªè˜ã—ãã®ä¸ã§åŒºåˆ‡ã‚‰ãªã„よã†ã«ã™ã‚‹ //* 2 :'〜'ã®éƒ¨åˆ†ã‚’1ã¤ã®æ–‡å—列ã¨ã—ã¦èªè˜ã—ãã®ä¸ã§åŒºåˆ‡ã‚‰ãªã„よã†ã«ã™ã‚‹ //* 4 :(〜)ã®éƒ¨åˆ†ã‚’1ã¤ã®æ–‡å—列ã¨ã—ã¦èªè˜ã—ãã®ä¸ã§åŒºåˆ‡ã‚‰ãªã„よã†ã«ã™ã‚‹ char * strtokEX( char ** pcStartString, const char * pcTokenSep, int iOption) { char * pcToken; int i,j; char cSectionStack[50]; //å¾…é¿ã‚¹ã‚¿ãƒƒã‚¯ãƒãƒƒãƒ•ã‚¡ memset(cSectionStack,'\0',sizeof(cSectionStack)); //区切り文å—を検索ã™ã‚‹ pcToken=*pcStartString+strspn(*pcStartString,pcTokenSep); for(i=0,j=0;((strchr(pcTokenSep,*(pcToken+i))==NULL)&&(j==0))||j>0;i++){ if(*(pcToken+i)=='\0'){ break; } switch (*(pcToken+i)){ case '"': case '\'': if(((iOption&0x01) != 0)&&(*(pcToken+i)=='"')){ break; } if(((iOption&0x02) != 0)&&(*(pcToken+i)=='\'')){ break; } if(j>0){ if(*(cSectionStack+j-1)==*(pcToken+i)){ *(cSectionStack+j-1)='\0'; j--; } else{ *(cSectionStack+j)=*(pcToken+i); j++; } } else{ *(cSectionStack+j)=*(pcToken+i); j++; } break; case '(': if((iOption & 0x04) != 0){ break; } *(cSectionStack+j)='('; j++; break; case ')': if((iOption & 0x04) != 0){ break; } if(j==0){ j--; break; } if(*(cSectionStack+j-1)=='('){ *(cSectionStack+j-1)='\0'; j--; } break; } if(j<0){ break; } } if(*(pcToken+i)!='\0'){ *(pcToken+i)='\0'; *pcStartString = pcToken+i+1; } else{ *pcStartString = NULL; } return pcToken; } //******************************************************************************* //* strTrim関数 * //******************************************************************************* //* æ–‡å—列ã®å‰å¾Œã®ç©ºç™½ã‚’除去ã™ã‚‹ //* parameter I/O inputBuffer :入出力ãƒãƒƒãƒ•ã‚¡ //* return :空白除去後ã®æ–‡å—列ã®å…ˆé アドレス char * strTrim(char * inputBuffer){ long i; while(*inputBuffer == ' '){ inputBuffer++; } for(i=(long)strlen(inputBuffer)-1;*(inputBuffer+i)==' ';i--){ *(inputBuffer+i)='\0'; } return inputBuffer; } char * strLTrim(char * inputBuffer){ while(*inputBuffer == ' '){ inputBuffer++; } return inputBuffer; } //******************************************************************************* //* 排他ãƒãƒƒã‚¯é–‹å§‹é–¢æ•° * //******************************************************************************* //* 排他ãƒãƒƒã‚¯ã‚’行ㆠ//* parameter I mutexNo :ãƒãƒƒã‚¯ç•ªå· int startLock(int mutexNo){ if ( mutexNo < 0 || mutexNo >= mutexCount ) return ( -1 ) ; #ifndef WIN32 pthread_mutex_lock( &mutex[mutexNo] ); #else WaitForSingleObject(hMutex[mutexNo],INFINITE); #endif return ( 0 ) ; } //******************************************************************************* //* 排他ãƒãƒƒã‚¯è§£é™¤é–¢æ•° * //******************************************************************************* //* 排他ãƒãƒƒã‚¯ã‚’解除ã™ã‚‹ //* parameter I mutexNo :ãƒãƒƒã‚¯ç•ªå· int endLock(int mutexNo){ if ( mutexNo < 0 || mutexNo >= mutexCount ) return ( -1 ) ; #ifndef WIN32 pthread_mutex_unlock( &mutex[mutexNo] ) ; #else ReleaseMutex( hMutex[mutexNo] ); #endif return ( 0 ) ; } //******************************************************************************* //* 排他ãƒãƒƒã‚¯åˆæœŸåŒ–関数 * //******************************************************************************* //* 排他ãƒãƒƒã‚¯ã‚’åˆæœŸåŒ–ã™ã‚‹ //* parameter I mutexNum :ãƒãƒƒã‚¯æ•°ï¼ˆæœ€å¤§10) int initLock(int mutexNum){ if ( mutexCount != 0 ) return ( -2 ) ; if ( mutexNum < 1 || mutexNum > maxMutexLock ) return ( -1 ) ; for ( int i = 0 ; i < mutexNum ;i++ ) { #ifndef WIN32 pthread_mutex_init ( &mutex[i],NULL ) ; #else hMutex[i] = CreateMutex(NULL,FALSE,NULL); #endif } mutexCount = mutexNum ; return ( 0 ) ; }