#ifndef __BCSysClass #define __BCSysClass //--------------------------------------------------------------------------- // ½Ã½ºÅÛ À¯Æ¿¸®Æ¼ Ŭ·¡½º // -------------------------------------------------------------------------- // Á¦ÀÛ¸ñÀû: // ÀÌ¹Ì Àͼ÷ÇÑ String °ú TStringList µîÀÇ ºô´õ Ŭ·¡½º¿Í ÇÔ¼ö¸¦ ÀÌ¿ëÇÏ¿© ÇÁ·Î±×·¥ÇÏ°í ½ÍÀºµ¥, // Áö¿øµÇÁö ¾ÊÀº ȯ°æ¿¡¼­ »ç¿ëÇϱâ À§ÇØ ¸¸µê. // ¶ÇÇÑ, ±âÁ¸ ¼Ò½º¸¦ ¼öÁ¤ÇÏ´Â ³ë·ÂÀ» Ãë¼Ò·ÎÇÏ¿© ¿Å±â±â À§ÇØ. // À©µµ¿ì ȯ°æ¿¡¼­ ¸¸µç ±â´ÉÀ» ¼ø¼öµµ½º¿ë ÇÁ·Î±×·¥À¸·Î ¹Ù²Ü·Á´Ï.. °ÅÀÇ ¾µ¼ö Àִ Ŭ·¡½º/ÇÔ¼ö°¡ ¾ø¾î Çã°Æ ÇßÀ½. ±×·¡¼­ ¸¸µê. // // ±¸Çö Ŭ·¡½º/ÇÔ¼ö: // AnsiString, String // TStringList // ExtractFileName // ExtractFilePath // FileExists // // Written by ±èżº(jsdkts@korea.com), Open Source. // // ³¯Â¥ ¼³¸í (update history) // -------------------------------------------------------------------------- // 2006-01-01 ù¹öÀü Á¦ÀÛ. ¸Þ¸ð¸® ´©¼ö¾øÀ½. ´õ ÇÊ¿äÇÑ ±â´ÉÀº Ãß°¡Çؼ­ ¾²¼¼¿ä. ^^; //--------------------------------------------------------------------------- namespace BCSysClass { typedef char byte; #define ZeroMemory(a,b) memset(a, 0, b) // ¼ø¼ö µµ½º¿¡¼­ »ç¿ëÇϱâ À§ÇÑ String Ŭ·¡½º // ¿ø·¡ C++Builder¿¡ ÀÖ´Â AnsiStringÀ» ¼ø¼ö µµ½º³ª VC++¿¡¼­ ÀÌ¿ëÇϱâ À§ÇØ ¸î°¡Áö ±â´É¸¸ ±¸ÇöÇÔ. // ÀϺΠµ¿ÀÛÀÌ Ç¥ÁØ AnsiString°ú´Â ¾à°£ Ʋ¸®³ª ´ë·« ºñ½ÁÇÏ°Ô »ç¿ëÇÒ¼ö ÀÖÀ½. class String { enum { BUFFER_SIZE = 4097 }; // 4k ¹®ÀÚ¿­ Àӽà ¹öÆÛ. private: char *Data; public: String() { Data = NULL; } String(char *str) { if (*str == 0 || str == NULL) Data = NULL; else { Data = new char[strlen(str)+1]; strcpy(Data, str); } } String(String& str) { if (str.Length() == 0) Data = NULL; else { Data = new char[str.Length()+1]; strcpy(Data, str.c_str()); } } String(char ch, int len) // ¿ø·¡ AnsiString¿¡´Â ¾øÀ¸³ª, ¹®ÀÚ¿­°ø°£ ¼±È®º¸ ¸ñÀûÀ¸·Î ½Å¼³. { if (len > 0) { Data = new char[len+1]; memset(Data, ch, len+1); } else Data = NULL; } ~String() { if (Data) { delete[] Data; Data = NULL; } } int Length() { if (Data == NULL) return 0; return strlen(Data); } char *c_str() { return Data; } String& operator=(char *str) { if (Data) { delete[] Data; Data = NULL; } if (strlen(str) > 0) { Data = new char[strlen(str) + 1]; strcpy(Data, str); } return *this; } String& operator=(String str) { if (Data) { delete[] Data; Data = NULL; } if (str.Length() > 0) { Data = new char[str.Length() + 1]; strcpy(Data, str.c_str()); } return *this; } String& SubString(int pos, int len) { if (pos == 0) return *this; // À§Ä¡ À妽º´Â 1ºÎÅÍ String *ps = new String(0, len); strncpy(ps->c_str(), Data + pos - 1, len); // ³¡¿¡ ÀÚµ¿ÃʱâÈ­µÈ 0°¡ ÀÖÀ¸¹Ç·Î. return *ps; } // String().sprintf("%d %s", a, b); ½ÄÀ¸·Îµµ »ç¿ë°¡´ÉÇÏ°Ô Çϱâ À§ÇØ. String& sprintf(const char* format, ...) { char buffer[BUFFER_SIZE]; va_list args; va_start(args, format); int len = vsprintf(buffer, format, args); va_end(args); if (len == EOF) len = 0; // throw "vsprintfÀÇ º¯È¯ ¿¡·¯"; String *ps = new String(0, len); strcpy(ps->c_str(), buffer); return *ps; } int printf(const char* format, ...) { char buffer[BUFFER_SIZE]; va_list args; va_start(args, format); int len = vsprintf(buffer, format, args); va_end(args); if (len == EOF) return 0; if (Data) { delete Data; Data = NULL; } if (len > 0) { Data = new char[len + 1]; strcpy(Data, buffer); } return len; } }; typedef String AnsiString; // ¼ø¼ö µµ½º¿¡¼­ »ç¿ëÇϱâ À§ÇØ TStringList¸¦ °£ÆíÇÏ°Ô »õ·Ó°Ô ¸¸µé¾ú´Ù. // ¿ø·¡ TObject¸¦ »ó¼ÓÇÑ VCL½ºÅ¸ÀÏ Å¬·¡½ºÀ̳ª ÀÌ°ÍÀº ¾Æ¹«°Íµµ »ó¼ÓÇÏÁö ¾Ê¾Ò´Ù. // °£ÆíÇÏ°Ô »ç¿ëÇÒ ¸ñÀûÀ̹ǷΠ¿¡·¯ üũ¸¦ ¾ÈÇÑ´Ù. class TStringList { // MAX_LINE * 4 ¸¸Å­ ½ºÆ®¸µ Æ÷ÀÎÆ® Å×À̺í·Î ¼Ò¿ä. // ¿ø·¡ ÇÑÁÙ´ç ÀνºÅϽº¿ë ¸Þ¸ð¸®¸¦ ÇÒ´ç¹Þ¾Æ¾ß Çϳª, °£ÆíÇÏ°Ô ±¸ÇöÇϱâ À§ÇØ. enum { MAX_LINE = 10000 }; private: int Max; public: int Count; String *Strings; public: TStringList(int max = MAX_LINE) { ZeroMemory(this, sizeof(*this)); Max = max; Strings = new String[max]; // »ý¼ºÀÚ¿¡¼­ ÀÚµ¿ 0·Î ¸ðµÎ ÃʱâÈ­µÈ´Ù. } ~TStringList() { delete[] Strings; } int Add(String str) { if (Count + 1 >= Max) throw "TStringList À妽º°ª ÃÊ°ú"; // over Strings[Count] = str; return Count++; } void Delete(int index) { if (index >= Count) return; if (Strings[index].Length() > 0) delete (Strings + index); memcpy(Strings + index, Strings + index + 1, sizeof(String) * (Max - index - 1)); ZeroMemory(Strings + Max-1, sizeof(String)); Count--; } String& operator[](int index) { return Strings[index]; } }; String ExtractFilePath(String filename) { int len = filename.Length(); char *p = filename.c_str(); for(int c = 0; c < len; c++) { char ch = p[len-c-1]; if (ch == '\\' || ch == ':') { return filename.SubString(1, len - c); } } return ""; } String ExtractFileName(String filename) { int len = filename.Length(); char *p = filename.c_str(); for(int c = 0; c < len; c++) { char ch = p[len-c-1]; if (ch == '\\' || ch == ':') { String name = (p + len - c); return name; } } return filename; } bool FileExists(String filename) { FILE *fp = fopen(filename.c_str(), "rb"); bool b = fp; if (fp) fclose(fp); return b; } }; // name space BCSysClass #endif