source: dev/branches/egtra/ab5.0/abdev/BasicCompiler_Common/StrOperation.cpp@ 820

Last change on this file since 820 was 820, checked in by イグトランス (egtra), 13 years ago

Typeクラスを単体テスト可能な状態へ

File size: 17.3 KB
Line 
1#include "stdafx.h"
2
3void KillSpaces(char const *str1,char *str2){
4 int i,i2,i3,IsStr;
5 for(i=0,i2=0,IsStr=0;;i++,i2++){
6 if((str1[i]==' '||str1[i]=='\t')&&IsStr==0){
7 i3=i+1;
8 while(str1[i3]==' '||str1[i3]=='\t') i3++;
9 if(i!=0){
10 if(i==1){
11 if(IsVariableChar(str1[i-1])&&
12 IsVariableChar(str1[i3])){
13 //識別子間にある省略すべきでない空白
14 str2[i2++]=' ';
15 }
16 }
17 else{
18 if(str1[i-2]!=1&&IsVariableChar(str1[i-1])&&
19 IsVariableChar(str1[i3])){
20 //識別子間にある省略すべきでない空白
21 str2[i2++]=' ';
22 }
23 }
24 }
25 i=i3;
26 }
27 if(str1[i]=='\"') IsStr^=1;
28 str2[i2]=str1[i];
29 if(str1[i]=='\0') break;
30 }
31}
32void KillStringSpaces(char *str)
33{
34 std::string s2(str);
35 KillSpaces(s2.c_str(), str);
36}
37BOOL RemoveStringQuotes(char *str){
38 int i;
39 if(str[0]!='\"') return 0;
40 for(i=0;;i++){
41 str[i]=str[i+1];
42 if(str[i]=='\"') break;
43 }
44 str[i]=0;
45 if(str[i+2]!='\0') return 0;
46 return 1;
47}
48bool RemoveStringQuotes( std::string &str )
49{
50 if( str[0] != '\"' )
51 {
52 return false;
53 }
54
55 str = str.substr( 1, str.length() - 2 );
56 return true;
57}
58void RemoveStringPare(char *str){
59 int i;
60 i=lstrlen(str);
61 if(str[0]!='('||str[i-1]!=')') return;
62 SlideString(str+1,-1);
63 str[i-2]=0;
64}
65void RemoveStringBracket(char *str){
66 int i;
67 i=lstrlen(str);
68 if(str[0]!='['||str[i-1]!=']') return;
69 SlideString(str+1,-1);
70 str[i-2]=0;
71}
72void SetStringQuotes(char *str){
73 int i;
74 if(str[0]=='\"') return;
75 i=lstrlen(str);
76 SlideString(str,1);
77 str[0]='\"';
78 str[i+1]='\"';
79 str[i+2]=0;
80}
81int FormatString_EscapeSequence(char *buffer){
82 int i2,i3,i4;
83
84 for(i2=0,i3=0;;i2++,i3++){
85 if(IsDBCSLeadByte(buffer[i3])){
86 buffer[i2++]=buffer[i3++];
87 buffer[i2]=buffer[i3];
88 if(buffer[i3]=='\0') break;
89 continue;
90 }
91 if(buffer[i3]=='\\'){
92 switch(buffer[i3+1]){
93 case '\\':
94 buffer[i2]='\\';
95 i3++;
96 break;
97 case '0':
98 buffer[i2]='\0';
99 i3++;
100 break;
101 case 'n':
102 buffer[i2]='\n';
103 i3++;
104 break;
105 case 'q':
106 buffer[i2]='\"';
107 i3++;
108 break;
109 case 'r':
110 buffer[i2]='\r';
111 i3++;
112 break;
113 case 't':
114 buffer[i2]='\t';
115 i3++;
116 break;
117 case 'x':
118 //16進表記
119 char temporary[8];
120 temporary[0]=buffer[i3+2];
121 temporary[1]=buffer[i3+3];
122 temporary[2]=0;
123 CharUpper(temporary);
124
125 i4=temporary[0]-0x30;
126 if(i4<0||9<i4){
127 i4=temporary[0]-0x41+10;
128 if(i4<0xA||0xF<i4){
129 buffer[i2]=buffer[i3];
130 break;
131 }
132 }
133 temporary[0]=i4;
134
135 i4=temporary[1]-0x30;
136 if(i4<0||9<i4){
137 i4=temporary[1]-0x41+10;
138 if(i4<0xA||0xF<i4){
139 buffer[i2]=buffer[i3];
140 break;
141 }
142 }
143 temporary[1]=i4;
144
145 buffer[i2]=temporary[0]*0x10+temporary[1];
146 i3+=3;
147 break;
148 default:
149 buffer[i2]=buffer[i3];
150 break;
151 }
152 }
153 else{
154 buffer[i2]=buffer[i3];
155 if(buffer[i3]=='\0') break;
156 }
157 }
158 return i2;
159}
160void SlideString(char *buffer, int slide){
161 Text::SlideString(buffer,slide);
162}
163void SlideBuffer(char *buffer,int length,int slide){
164 memmove(buffer+slide,buffer,length);
165}
166
167int GetSourceCodeIndexFromLine( const char *source, int LineNum ){
168 int i,nCount=0;
169 for(i=0;;i++){
170 if(source[i]=='\n'){
171 nCount++;
172 if(LineNum==nCount){
173 for(i++;;i++){
174 if(IsCommandDelimitation(source[i])) break;
175 }
176 return i;
177 }
178 }
179 }
180}
181
182char GetEndXXXCommand(char es){
183 switch(es){
184 case ESC_SUB:
185 return ESC_ENDSUB;
186 case ESC_FUNCTION:
187 return ESC_ENDFUNCTION;
188 case ESC_MACRO:
189 return ESC_ENDMACRO;
190 case ESC_TYPE:
191 return ESC_ENDTYPE;
192 case ESC_CLASS:
193 return ESC_ENDCLASS;
194 case ESC_INTERFACE:
195 return ESC_ENDINTERFACE;
196 case ESC_ENUM:
197 return ESC_ENDENUM;
198 }
199 return 0;
200}
201void GetDefaultNameFromES(char es,char *name){
202 name[0]=0;
203 switch(es){
204 case ESC_PSMEM:
205 lstrcpy(name,"->");
206 break;
207 case ESC_MOD:
208 lstrcpy(name,"Mod");
209 break;
210 case ESC_AND:
211 lstrcpy(name,"And");
212 break;
213 case ESC_OR:
214 lstrcpy(name,"Or");
215 break;
216 case ESC_XOR:
217 lstrcpy(name,"Xor");
218 break;
219 case ESC_NOT:
220 lstrcpy(name,"Not");
221 break;
222 case ESC_AS:
223 lstrcpy(name,"As");
224 break;
225 case ESC_THEN:
226 lstrcpy(name,"Then");
227 break;
228 case ESC_ELSE:
229 lstrcpy(name,"Else");
230 break;
231 case ESC_IF:
232 lstrcpy(name,"If");
233 break;
234 case ESC_ELSEIF:
235 lstrcpy(name,"ElseIf");
236 break;
237 case ESC_ENDIF:
238 lstrcpy(name,"End If");
239 break;
240 case ESC_DEF:
241 lstrcpy(name,"Def");
242 break;
243 case ESC_DECLARE:
244 lstrcpy(name,"Declare");
245 break;
246 case ESC_ABSTRACT:
247 lstrcpy(name,"Abstract");
248 break;
249 case ESC_VIRTUAL:
250 lstrcpy(name,"Virtual");
251 break;
252 case ESC_OVERRIDE:
253 lstrcpy(name,"Override");
254 break;
255 case ESC_SUB:
256 lstrcpy(name,"Sub");
257 break;
258 case ESC_ENDSUB:
259 lstrcpy(name,"End Sub");
260 break;
261 case ESC_EXITSUB:
262 lstrcpy(name,"Exit Sub");
263 break;
264 case ESC_FUNCTION:
265 lstrcpy(name,"Function");
266 break;
267 case ESC_ENDFUNCTION:
268 lstrcpy(name,"End Function");
269 break;
270 case ESC_EXITFUNCTION:
271 lstrcpy(name,"Exit Function");
272 break;
273 case ESC_BYVAL:
274 lstrcpy(name,"ByVal ");
275 break;
276 case ESC_BYREF:
277 lstrcpy(name,"ByRef ");
278 break;
279 case ESC_TYPE:
280 lstrcpy(name,"Type");
281 break;
282 case ESC_ENDTYPE:
283 lstrcpy(name,"End Type");
284 break;
285 case ESC_EXITFOR:
286 lstrcpy(name,"Exit For");
287 break;
288 case ESC_EXITWHILE:
289 lstrcpy(name,"Exit While");
290 break;
291 case ESC_EXITDO:
292 lstrcpy(name,"Exit Do");
293 break;
294 case ESC_SELECTCASE:
295 lstrcpy(name,"Select Case");
296 break;
297 case ESC_CASE:
298 lstrcpy(name,"Case");
299 break;
300 case ESC_CASEELSE:
301 lstrcpy(name,"Case Else");
302 break;
303 case ESC_ENDSELECT:
304 lstrcpy(name,"End Select");
305 break;
306 case ESC_CONST:
307 lstrcpy(name,"Const");
308 break;
309 case ESC_TYPEDEF:
310 lstrcpy(name,"TypeDef");
311 break;
312 case ESC_WITH:
313 lstrcpy(name,"With");
314 break;
315 case ESC_ENDWITH:
316 lstrcpy(name,"End With");
317 break;
318 case ESC_CDECL:
319 lstrcpy(name,"cdecl");
320 break;
321 case ESC_MACRO:
322 lstrcpy(name,"Macro");
323 break;
324 case ESC_ENDMACRO:
325 lstrcpy(name,"End Macro");
326 break;
327 case ESC_EXITMACRO:
328 lstrcpy(name,"Exit Macro");
329 break;
330 case ESC_EXPORT:
331 lstrcpy(name,"Export");
332 break;
333 case ESC_CONTINUE:
334 lstrcpy(name,"Continue");
335 break;
336 case ESC_CLASS:
337 lstrcpy(name,"Class");
338 break;
339 case ESC_ENDCLASS:
340 lstrcpy(name,"End Class");
341 break;
342 case ESC_INTERFACE:
343 lstrcpy(name,"Interface");
344 break;
345 case ESC_ENDINTERFACE:
346 lstrcpy(name,"End Interface");
347 break;
348 case ESC_ENUM:
349 lstrcpy(name,"Enum");
350 break;
351 case ESC_ENDENUM:
352 lstrcpy(name,"End Enum");
353 break;
354 case ESC_OPERATOR:
355 lstrcpy( name, "Operator" );
356 break;
357 }
358}
359std::string FormatEscapeSequenceStringToDefaultString( const std::string &source )
360{
361 int maxLength = (int)source.size();
362
363 char *temporary = (char *)malloc( source.size() + 8192 );
364 lstrcpy( temporary, source.c_str() );
365
366 for( int i=0; i<maxLength-1; i++ )
367 {
368 if( temporary[i] == 1 )
369 {
370 int esc = temporary[i+1];
371 char temp2[255];
372 GetDefaultNameFromES( esc, temp2 );
373 if( i>0 )
374 {
375 char temp3[255];
376 wsprintf( temp3, " %s", temp2 );
377 lstrcpy( temp2, temp3 );
378 }
379 if( i<maxLength-2 )
380 {
381 lstrcat( temp2, " " );
382 }
383
384 int slide = 2;
385
386 if( esc == ESC_OPERATOR )
387 {
388 extern char const *calcNames[256];
389 unsigned char calcId = temporary[i+2];
390 if( calcNames[calcId] )
391 {
392 lstrcat( temp2, calcNames[calcId] );
393 }
394 slide = 3;
395 }
396
397 int length = lstrlen( temp2 );
398 SlideString( temporary + i+slide, length-slide );
399 memcpy( temporary + i, temp2, length );
400 maxLength = lstrlen( temporary );
401 }
402 }
403
404 static std::string resultStr = temporary;
405
406 free( temporary );
407
408 return resultStr;
409}
410
411bool IsFileExist(const char *path){
412 WIN32_FIND_DATA wfd;
413 HANDLE hFind;
414
415 hFind=FindFirstFile(path,&wfd);
416 if(hFind==INVALID_HANDLE_VALUE){
417 return false;
418 }
419 FindClose(hFind);
420
421 return true;
422}
423BOOL GetFolder(HWND hWnd,char *folder,char *OpenFolderTitle){
424 BROWSEINFO BrowseInfo;
425 LPITEMIDLIST pidlBrowse;
426 char temporary[MAX_PATH];
427
428 BrowseInfo.hwndOwner=hWnd;
429 BrowseInfo.pszDisplayName=temporary;
430 BrowseInfo.pidlRoot=NULL;
431 BrowseInfo.lpszTitle=OpenFolderTitle;
432 BrowseInfo.ulFlags=BIF_RETURNONLYFSDIRS;
433 BrowseInfo.lpfn=NULL;
434 BrowseInfo.lParam=(LPARAM)0;
435 BrowseInfo.iImage=0;
436 pidlBrowse=SHBrowseForFolder(&BrowseInfo);
437 if(pidlBrowse){
438 BOOL ret = SHGetPathFromIDList(pidlBrowse,folder);
439 CoTaskMemFree(pidlBrowse);
440 return ret;
441 }
442 return 0;
443}
444
445void ShortPathToLongPath(const char *ShortPath,char *LongPath){
446 HANDLE hFind;
447 WIN32_FIND_DATA wfd;
448 int i;
449 char dummy[MAX_PATH];
450 for(i=0;i<MAX_PATH;i++){
451 LongPath[i]=ShortPath[i];
452 if((ShortPath[i-1]==':'&&ShortPath[i]=='\\')||(ShortPath[i-1]=='\\'&&ShortPath[i]=='\\')){
453 LongPath[i+1]=0;
454 break;
455 }
456 }
457 if(ShortPath[i-1]=='\\'&&ShortPath[i]=='\\'){
458 for(i++;i<MAX_PATH;i++){
459 if(IsDBCSLeadByte(ShortPath[i])){
460 i++;
461 continue;
462 }
463 LongPath[i]=ShortPath[i];
464 if(ShortPath[i]=='\\'){
465 LongPath[i+1]=0;
466 break;
467 }
468 }
469 for(i++;i<MAX_PATH;i++){
470 if(IsDBCSLeadByte(ShortPath[i])){
471 i++;
472 continue;
473 }
474 LongPath[i]=ShortPath[i];
475 if(ShortPath[i]=='\\'){
476 LongPath[i+1]=0;
477 break;
478 }
479 }
480 }
481 for(i++;i<MAX_PATH;i++){
482 if(IsDBCSLeadByte(ShortPath[i])){
483 i++;
484 continue;
485 }
486 if(ShortPath[i]=='\\'||ShortPath[i]=='\0'){
487 strncpy(dummy,ShortPath,i);
488 dummy[i]=0;
489 if((hFind=FindFirstFile(dummy,&wfd))!=INVALID_HANDLE_VALUE) FindClose(hFind);
490 lstrcat(LongPath,wfd.cFileName);
491
492 if(ShortPath[i]=='\0') break;
493 lstrcat(LongPath,"\\");
494
495 if(ShortPath[i]=='\\'&&ShortPath[i+1]=='\0'){
496 break;
497 }
498 }
499 }
500}
501
502
503bool IsVariableTopChar(char c){
504 if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||c=='_')
505 {
506 return true;
507 }
508 return false;
509}
510bool IsVariableChar( char c, bool isGenericsChars ){
511 if((c>='A'&&c<='Z')||(c>='a'&&c<='z')||(c>='0'&&c<='9')||
512 c=='%'||c=='!'||c=='#'||c=='$'||
513 c=='_'||c=='.')
514 {
515 return true;
516 }
517
518 if( isGenericsChars )
519 {
520 if( c == '<' || c == '>' )
521 {
522 return true;
523 }
524 }
525
526 return false;
527}
528bool IsBlank(char c){
529 if(c==' '||c=='\t') return 1;
530 return 0;
531}
532int GetOneParameter(const char *Parameter,int pos,char *retAns){
533 int i,i2,i3,IsStr;
534 for(i=pos,i2=0,IsStr=0;;i++,i2++){
535 if(Parameter[i]=='\"') IsStr^=1;
536 else if(Parameter[i]=='('&&IsStr==0){
537 i3=GetStringInPare(retAns+i2,Parameter+i);
538 i+=i3-1;
539 i2+=i3-1;
540 continue;
541 }
542 else if(Parameter[i]=='['&&IsStr==0){
543 i3=GetStringInBracket(retAns+i2,Parameter+i);
544 i+=i3-1;
545 i2+=i3-1;
546 continue;
547 }
548 else if(Parameter[i]==','&&IsStr==0){
549 retAns[i2]=0;
550 i++;
551 break;
552 }
553
554 if(IsCommandDelimitation(Parameter[i])&&IsStr==0
555 || Parameter[i] == ')' && IsStr == 0 ){
556 retAns[i2]=0;
557 break;
558 }
559
560 retAns[i2]=Parameter[i];
561 }
562 return i;
563}
564int JumpOneParameter(char *Parameter,int i){
565 int i2,IsStr;
566 for(i2=0,IsStr=0;;i++,i2++){
567 if(Parameter[i]=='\"') IsStr^=1;
568 else if(Parameter[i]=='('&&IsStr==0){
569 i=JumpStringInPare(Parameter,i+1);
570 continue;
571 }
572 else if(Parameter[i]=='['&&IsStr==0){
573 i=JumpStringInBracket(Parameter,i+1);
574 continue;
575 }
576 else if(Parameter[i]==','&&IsStr==0){
577 i++;
578 break;
579 }
580 if(IsCommandDelimitation(Parameter[i])) break;
581 }
582 return i;
583}
584int GetStringInQuotation(char *buffer,char *ReadBuffer){
585 int i;
586
587 if(ReadBuffer[0]=='\"'){
588 buffer[0]=ReadBuffer[0];
589 i=1;
590 }
591 else i=0;
592
593 for(;;i++){
594 buffer[i]=ReadBuffer[i];
595 if(IsDBCSLeadByte(ReadBuffer[i])){
596 i++;
597 buffer[i]=ReadBuffer[i];
598 continue;
599 }
600 if(ReadBuffer[i]=='\"'){
601 i++;
602 buffer[i]=0;
603 break;
604 }
605 if(ReadBuffer[i]=='\0') return 0;
606 }
607 return i;
608}
609int GetStringInPare( char *buffer, const char *ReadBuffer, bool isRemovePare ){
610 int i,IsStr,PareNum;
611 for(i=0,IsStr=0,PareNum=0;;i++){
612 buffer[i]=ReadBuffer[i];
613 if(IsDBCSLeadByte(ReadBuffer[i])){
614 i++;
615 buffer[i]=ReadBuffer[i];
616 continue;
617 }
618 if(ReadBuffer[i]=='\"') IsStr^=1;
619 else if(ReadBuffer[i]=='('&&IsStr==0) PareNum++;
620 else if(ReadBuffer[i]==')'&&IsStr==0){
621 PareNum--;
622 if(PareNum==0){
623 i++;
624 buffer[i]=0;
625 break;
626 }
627 }
628 else if(ReadBuffer[i]=='\0') return 0;
629 }
630
631 if( isRemovePare )
632 {
633 RemoveStringPare( buffer );
634 }
635
636 return i;
637}
638int GetStringInBracket(char *buffer,const char *ReadBuffer){
639 int i,IsStr,PareNum;
640 for(i=0,IsStr=0,PareNum=0;;i++){
641 buffer[i]=ReadBuffer[i];
642 if(IsDBCSLeadByte(ReadBuffer[i])){
643 i++;
644 buffer[i]=ReadBuffer[i];
645 continue;
646 }
647 if(ReadBuffer[i]=='\"') IsStr^=1;
648 else if(ReadBuffer[i]=='['&&IsStr==0) PareNum++;
649 else if(ReadBuffer[i]==']'&&IsStr==0){
650 PareNum--;
651 if(PareNum==0){
652 i++;
653 buffer[i]=0;
654 break;
655 }
656 }
657 else if(ReadBuffer[i]=='\0') return 0;
658 }
659 return i;
660}
661int GetStringInGenericBracket(char *buffer,const char *ReadBuffer){
662 int i,IsStr,PareNum;
663 for(i=0,IsStr=0,PareNum=0;;i++){
664 buffer[i]=ReadBuffer[i];
665 if(IsDBCSLeadByte(ReadBuffer[i])){
666 i++;
667 buffer[i]=ReadBuffer[i];
668 continue;
669 }
670 if(ReadBuffer[i]=='\"') IsStr^=1;
671 else if(ReadBuffer[i]=='<'&&IsStr==0) PareNum++;
672 else if(ReadBuffer[i]=='>'&&IsStr==0){
673 PareNum--;
674 if(PareNum==0){
675 i++;
676 buffer[i]=0;
677 break;
678 }
679 }
680 else if(ReadBuffer[i]=='\0') return 0;
681 }
682 return i;
683}
684int JumpStringInPare(const char *buffer,int pos){
685 int PareNum;
686 for(PareNum=1;;pos++){
687 if(buffer[pos]=='\"'){
688 for(pos++;;pos++){
689 if(buffer[pos]=='\"') break;
690 }
691 continue;
692 }
693 else if(buffer[pos]=='(') PareNum++;
694 else if(buffer[pos]==')'){
695 PareNum--;
696 if(PareNum==0) return pos;
697 }
698 else if(buffer[pos]=='\0') break;
699 }
700 return 0;
701}
702int JumpStringInBracket(const char *buffer,int pos){
703 int PareNum;
704 for(PareNum=1;;pos++){
705 if(buffer[pos]=='\"'){
706 for(pos++;;pos++){
707 if(buffer[pos]=='\"') break;
708 }
709 continue;
710 }
711 else if(buffer[pos]=='[') PareNum++;
712 else if(buffer[pos]==']'){
713 PareNum--;
714 if(PareNum==0) return pos;
715 }
716 else if(buffer[pos]=='\0') break;
717 }
718 return 0;
719}
720bool IsCommandDelimitation( char c ){
721 if( c == '\n' || c == ':' || c == '\0' ){
722 return true;
723 }
724
725 return false;
726}
727
728int GetStringInPare_RemovePare(char *buffer,const char *ReadBuffer){
729 int i,IsStr,PareNum;
730 for(i=0,IsStr=0,PareNum=1;;i++){
731 buffer[i]=ReadBuffer[i];
732 if(IsDBCSLeadByte(ReadBuffer[i])){
733 i++;
734 buffer[i]=ReadBuffer[i];
735 continue;
736 }
737 if(ReadBuffer[i]=='\"') IsStr^=1;
738 else if(ReadBuffer[i]=='('&&IsStr==0) PareNum++;
739 else if(ReadBuffer[i]==')'&&IsStr==0){
740 PareNum--;
741 if(PareNum==0){
742 buffer[i]=0;
743 break;
744 }
745 }
746 else if(ReadBuffer[i]=='\0') return 0;
747 }
748 return i;
749}
750
751void SplitParameter( const std::string &src, Jenga::Common::Strings &dests, bool isClear )
752{
753 const char *buffer = src.c_str();
754 int i = 0;
755
756 if( isClear )
757 {
758 dests.clear();
759 }
760
761 while( buffer[i] )
762 {
763 char result[8192];
764 i = GetOneParameter( buffer, i, result );
765 dests.push_back( result );
766 }
767}
768
769
770bool SplitMemberName( const char *desc, char *object, char *member, ReferenceKind &refType ){
771 int lastIndex = -1;
772 for( int i=0; desc[i]; i++ ){
773 if( desc[i] == '(' ){
774 i=JumpStringInPare(desc,i+1);
775 continue;
776 }
777 else if( desc[i] == '[' ){
778 i=JumpStringInBracket(desc,i+1);
779 continue;
780 }
781 else if(desc[i]=='.'||(desc[i]==1&&desc[i+1]==ESC_PSMEM)){
782 lastIndex = i;
783 }
784 }
785 if( lastIndex == -1 ){
786 if( object )
787 {
788 object[0] = 0;
789 }
790 lstrcpy( member, desc );
791 return false;
792 }
793
794 if(desc[lastIndex]=='.'){
795 lstrcpy(member,desc+lastIndex+1);
796 refType = RefDot;
797 }
798 else{
799 lstrcpy(member,desc+lastIndex+2);
800 refType = RefPointer;
801 }
802
803 if( object ){
804 lstrcpy( object, desc );
805 object[lastIndex]=0;
806 }
807
808 return true;
809}
810bool SplitMemberName( const char *desc, char *object, char *member ){
811 ReferenceKind dummyRefType;
812 return SplitMemberName( desc, object, member, dummyRefType );
813}
814
815void SplitSyntacticForAs( const char *src, char *varName, char *typeName)
816{
817 int i = 0;
818 for( ; ; i++ )
819 {
820 if( src[i] == '\0' || src[i] == 1 && src[i+1] == ESC_AS )
821 {
822 varName[i] = 0;
823 break;
824 }
825 varName[i] = src[i];
826 }
827
828 if( src[i] )
829 {
830 lstrcpy( typeName, src + i + 2 );
831 }
832 else
833 {
834 typeName[i] = 0;
835 }
836}
837
838bool IsGenericTypeSourcePart( const char *buffer )
839{
840 if( buffer[0] != '<' )
841 {
842 Jenga::Throw( "意図しない文字列に対してIsGenericTypeSourcePart関数が呼ばれた" );
843 return false;
844 }
845
846 int i=1, scopeCount=1;
847 for( ; ; i++ )
848 {
849 if( buffer[i] == '\0' )
850 {
851 break;
852 }
853 if( buffer[i] == '<' )
854 {
855 scopeCount++;
856 }
857 else if( buffer[i] == '>' )
858 {
859 scopeCount--;
860
861 if( scopeCount == 0 )
862 {
863 break;
864 }
865 }
866 }
867
868 if( buffer[i] != '>' )
869 {
870 return false;
871 }
872
873
874 /////////////////////////////////////////////////////////////////
875 // '>'に続く文字を判定する
876 /////////////////////////////////////////////////////////////////
877
878 i++;
879 while( IsBlank( buffer[i] ) )
880 {
881 i++;
882 }
883
884 if( IsVariableChar( buffer[i] ) )
885 {
886 return false;
887 }
888
889 return true;
890}
Note: See TracBrowser for help on using the repository browser.