// week14p2.c       ./index.html (HWK# ncal)
//========================

///week14p2.c / week14p2.cpp -- for HWK# @Week14
///// 注意必須測試另存新檔成 .c 和 .cpp 都要測試 !
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h> // C string
#ifdef __cplusplus
  #include <string>  // C++ string
  #include <iostream>
  using namespace std; // std::
  extern "C" {  // 表示以下都是 "C" program 
#endif
// "C" program
char aa[6][26], bb[6][26], cc[6][26];  // Global
char tt[26]=".Su Mo Tu We Th Fr Sa _+_";  // Global
int whoRU( ), testInput( ), testP3M( );
int isInStr(char c, const char *str) {
  int k=strlen(str);
  while(k > 0) {
    k--;
    if(c == str[k]) return 1;
    if(k==0) return 0;
  }//while
  return 0; // 其實不可能跑到這 ! 
} // isInStr(c, str
int main( ) {
  whoRU( ); srand(time(0));
  printf("isInStr('q', \"QqEe\")==%d\n", isInStr('q', "QqEe") );
  testInput( );
  testP3M( );
  fprintf(stderr, "=== End of main( ) ===\n");
}
int findNums(int g[ ], char*buf) {
   int num = 0;
   if(buf==0 || buf[0]==0) return 0;
   char *bufOLD = buf;
   g[0] = strtol(buf, &buf, 10);
   if(bufOLD == buf) return 0; 
   bufOLD = buf;
   g[1] = strtol(buf, &buf, 10);
   if(bufOLD == buf) return 1;
   bufOLD = buf;
   g[2] = strtol(buf, &buf, 10);
   if(bufOLD == buf) return 2;
   return 3; // Got 3 numbers
} // findNums
typedef enum COUNTRY {
    TAIWAN=38, CHINA=49, JAPAN=55, USA= 22,
} COUNTRY;
COUNTRY  ccc = USA; // Country Code defaualt == USA; Global
int prtCCC(COUNTRY p) {
  if(p == TAIWAN) {
    fprintf(stderr, "Switch to TAIWAN\n");
    return p;
  }
  switch(p){
   case USA:
     fprintf(stderr, "Switch to USA 美國英國加拿大\n");
     break;
   case CHINA:
     fprintf(stderr, "清朝和中國都和 TAIWAN 同!\n"); 
     break;
   case JAPAN:
     printf("日本\n");
     break;
   default:
     break;
  }
  return p;
} // prtCCC(
int testInput( ){
    char buf[99];
    int got[9]; // 其實只用三個 元素
  COUNTRY cccOLD = ccc;
  while(38) {
    cccOLD = ccc; // 記住原先 ccc 
    fprintf(stderr,"打一列數值或cjQ: ");
    fgets(buf, sizeof buf, stdin);
    if(feof(stdin)) exit(3388); // EOF, 故意結束整個程式 
    if(isInStr(buf[0], "QEqe") ) break;
    if( isInStr(buf[0], "JjNn") ) ccc = JAPAN;
    if( isInStr(buf[0], "tT") ) ccc = TAIWAN;
    if( isInStr(buf[0], "Cc") ) ccc = CHINA;
    if( isInStr(buf[0], "AUua") ) ccc = USA;
    if(cccOLD != ccc) {
       prtCCC(ccc);
       continue; // 不處理 input 數值 
    }
    int n = findNums(got, buf);
    char fmt[66] = " Got %d numbers:  %d %d %d \n"; // 以下偷改 fmt[ ] 內容
    if(n==0) sprintf(fmt+15, ".%s\n", "       ");  // 注意這的 fmt+15 有義意喔
    if(n==1) sprintf(fmt+14, ": %s\n", " %d       ");
    if(n==2) sprintf(fmt+15, ":%s", " %d %d\n\r ");
    fprintf(stderr, fmt,  // 注意 fmt 在上面幾句可能已經被偷改掉
         n, got[0], got[1], got[2]);  // 若有多的參數沒對應到 %d 或 %啥的並沒關係 !
  } // while
  fprintf(stderr, "Bye ! 再見 !\n"); 
} // testInput(
int clearABC( ){  // 注意 aa, bb, cc 都是 char [6][26] 
   int i; 
   for(i=0; i<6; ++i) {
     sprintf(aa[i],"%25s", " ");  // 用 %25s 是因 [26] 有 26 Bytes 
     sprintf(bb[i],"%25s", " "); // 注意C字串 結束須有 '\0' (NULL) 
     sprintf(cc[i],"%25s", " ");  
     // 以下兩列 Debug 用, 建議刪除或註解掉!
     if(i==0)fprintf(stderr, "strlen of them===%d %d %d\n", 
          strlen(aa[i]),  strlen(bb[i]), strlen(cc[i]) );
   }
}// clearABC
int putABC(int y, int m, char abc[6][26]){ // 用來塞入 aa[], bb[], cc[]
   sprintf(abc[0], "%15d%10s", y, " "); // 共 25 char 
   sprintf(abc[1],  "%%13s:: [%13s]   ", "LINE 1"); // 要確保 25 char 不然格式會亂掉
   sprintf(abc[2], "%%-13s:: [%-13s]  ", "LINE 2"); // " "
   sprintf(abc[3], "%3d %5d %7d%7s|", m, m, m, " "); // 補個 %7s| 也是共 25 char; 
   int i, gg= 2 + rand( )%5;
   for(i=0; i< 7; ++i) {
     sprintf(abc[4]+3*i, " %2d", gg+i); // 6  7  8  9 10 11 12
     sprintf(abc[5]+3*i, " %2d", gg+i+7); // 13 .. 19
   }
   sprintf(abc[4]+21, "   ]");
   sprintf(abc[5]+21, "    ");  // 故意 
}
int testP3M( ) {
  // Demo Print 3 Month
  int i;
  clearABC( ); // 清除 字串 aa[], bb[], cc[] 
  fprintf(stderr, "testP3M( ) . . .\n");
  putABC(2345222, 2, bb);
  putABC(2024, 3, cc);
  putABC(10111, 7, aa);
  fprintf(stderr, "Now print 3M out\n");
  fprintf(stdout, "%s%s%s\n", tt, tt, " Su Mo Tu We Th Fr Sa =" ); //故意 !
  for(i=0; i<=5; ++i){
     fprintf(stdout, "%s%s%s\n", aa[i], bb[i], cc[i]);
  }
} // testP3M(
int whoRU( ) {
  int m=38, kk=49;
  fprintf(stderr, "Original: m=%d, kk=%d\n", m, kk);  // good for C/C++
 #if defined(__cplusplus)    // 用#if 因為只最新版的 C 的 #ifdef 才可用 #elifdef 
    cerr << "You are using C++ compiler ! Filename is .cpp ?\n";
    cerr << "C++ has Generic template function swap(T,T) 只要 #include <iostream>就可用\n"; 
    swap(m, kk);
    cerr << "m=" << m <<"; kk="<<kk<<endl;
    cerr << "記得也要另存新檔 .c 檔案再次測試 !\n"; 
 #else
    fprintf(stderr, "You R uning pure C compiler. with a .c File?\n");
    fprintf(stderr, "你需要自己寫 swap(變數指標, 變數指標) 做對調\n"); 
 #endif
}
#ifdef __cplusplus
} // 對應前面的 extern "C" {
#endif
////// End of week14p02.c / week14p02.cpp 
//  more TBA ?
/// 就降子啦 
//////////////
//   https://www.tondering.dk/claus/cal/chinese.php   (ncal / Calendar FAQ)
/////////////////////