1 /**************************************************************************** |
1 /**************************************************************************** |
2 ** |
2 ** |
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). |
3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). |
4 ** All rights reserved. |
4 ** All rights reserved. |
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
5 ** Contact: Nokia Corporation (qt-info@nokia.com) |
6 ** |
6 ** |
7 ** This file is part of the qmake application of the Qt Toolkit. |
7 ** This file is part of the qmake application of the Qt Toolkit. |
8 ** |
8 ** |
395 if(fd == -1 || fstat(fd, &fst) || S_ISDIR(fst.st_mode)) |
395 if(fd == -1 || fstat(fd, &fst) || S_ISDIR(fst.st_mode)) |
396 return false; |
396 return false; |
397 buffer = getBuffer(fst.st_size); |
397 buffer = getBuffer(fst.st_size); |
398 for(int have_read = 0; |
398 for(int have_read = 0; |
399 (have_read = QT_READ(fd, buffer + buffer_len, fst.st_size - buffer_len)); |
399 (have_read = QT_READ(fd, buffer + buffer_len, fst.st_size - buffer_len)); |
400 buffer_len += have_read); |
400 buffer_len += have_read) ; |
401 QT_CLOSE(fd); |
401 QT_CLOSE(fd); |
402 } |
402 } |
403 if(!buffer) |
403 if(!buffer) |
404 return false; |
404 return false; |
405 if(!file->deps) |
405 if(!file->deps) |
416 ++x; |
416 ++x; |
417 if(*(buffer + x) == '<') { |
417 if(*(buffer + x) == '<') { |
418 ++x; |
418 ++x; |
419 if(buffer_len >= x + 12 && !strncmp(buffer + x, "includehint", 11) && |
419 if(buffer_len >= x + 12 && !strncmp(buffer + x, "includehint", 11) && |
420 (*(buffer + x + 11) == ' ' || *(buffer + x + 11) == '>')) { |
420 (*(buffer + x + 11) == ' ' || *(buffer + x + 11) == '>')) { |
421 for(x += 11; *(buffer + x) != '>'; ++x); |
421 for(x += 11; *(buffer + x) != '>'; ++x) ; |
422 int inc_len = 0; |
422 int inc_len = 0; |
423 for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len); |
423 for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len) ; |
424 *(buffer + x + inc_len) = '\0'; |
424 *(buffer + x + inc_len) = '\0'; |
425 inc = buffer + x; |
425 inc = buffer + x; |
426 } else if(buffer_len >= x + 13 && !strncmp(buffer + x, "customwidget", 12) && |
426 } else if(buffer_len >= x + 13 && !strncmp(buffer + x, "customwidget", 12) && |
427 (*(buffer + x + 12) == ' ' || *(buffer + x + 12) == '>')) { |
427 (*(buffer + x + 12) == ' ' || *(buffer + x + 12) == '>')) { |
428 for(x += 13; *(buffer + x) != '>'; ++x); //skip up to > |
428 for(x += 13; *(buffer + x) != '>'; ++x) ; //skip up to > |
429 while(x < buffer_len) { |
429 while(x < buffer_len) { |
430 for(x++; *(buffer + x) != '<'; ++x); //skip up to < |
430 for(x++; *(buffer + x) != '<'; ++x) ; //skip up to < |
431 x++; |
431 x++; |
432 if(buffer_len >= x + 7 && !strncmp(buffer+x, "header", 6) && |
432 if(buffer_len >= x + 7 && !strncmp(buffer+x, "header", 6) && |
433 (*(buffer + x + 6) == ' ' || *(buffer + x + 6) == '>')) { |
433 (*(buffer + x + 6) == ' ' || *(buffer + x + 6) == '>')) { |
434 for(x += 7; *(buffer + x) != '>'; ++x); //skip up to > |
434 for(x += 7; *(buffer + x) != '>'; ++x) ; //skip up to > |
435 int inc_len = 0; |
435 int inc_len = 0; |
436 for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len); |
436 for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len) ; |
437 *(buffer + x + inc_len) = '\0'; |
437 *(buffer + x + inc_len) = '\0'; |
438 inc = buffer + x; |
438 inc = buffer + x; |
439 break; |
439 break; |
440 } else if(buffer_len >= x + 14 && !strncmp(buffer+x, "/customwidget", 13) && |
440 } else if(buffer_len >= x + 14 && !strncmp(buffer+x, "/customwidget", 13) && |
441 (*(buffer + x + 13) == ' ' || *(buffer + x + 13) == '>')) { |
441 (*(buffer + x + 13) == ' ' || *(buffer + x + 13) == '>')) { |
446 } else if(buffer_len >= x + 8 && !strncmp(buffer + x, "include", 7) && |
446 } else if(buffer_len >= x + 8 && !strncmp(buffer + x, "include", 7) && |
447 (*(buffer + x + 7) == ' ' || *(buffer + x + 7) == '>')) { |
447 (*(buffer + x + 7) == ' ' || *(buffer + x + 7) == '>')) { |
448 for(x += 8; *(buffer + x) != '>'; ++x) { |
448 for(x += 8; *(buffer + x) != '>'; ++x) { |
449 if(buffer_len >= x + 9 && *(buffer + x) == 'i' && |
449 if(buffer_len >= x + 9 && *(buffer + x) == 'i' && |
450 !strncmp(buffer + x, "impldecl", 8)) { |
450 !strncmp(buffer + x, "impldecl", 8)) { |
451 for(x += 8; *(buffer + x) != '='; ++x); |
451 for(x += 8; *(buffer + x) != '='; ++x) ; |
452 if(*(buffer + x) != '=') |
452 if(*(buffer + x) != '=') |
453 continue; |
453 continue; |
454 for(++x; *(buffer+x) == '\t' || *(buffer+x) == ' '; ++x); |
454 for(++x; *(buffer+x) == '\t' || *(buffer+x) == ' '; ++x) ; |
455 char quote = 0; |
455 char quote = 0; |
456 if(*(buffer+x) == '\'' || *(buffer+x) == '"') { |
456 if(*(buffer+x) == '\'' || *(buffer+x) == '"') { |
457 quote = *(buffer + x); |
457 quote = *(buffer + x); |
458 ++x; |
458 ++x; |
459 } |
459 } |
473 //### do this |
473 //### do this |
474 } |
474 } |
475 } |
475 } |
476 } |
476 } |
477 int inc_len = 0; |
477 int inc_len = 0; |
478 for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len); |
478 for(x += 1 ; *(buffer + x + inc_len) != '<'; ++inc_len) ; |
479 *(buffer + x + inc_len) = '\0'; |
479 *(buffer + x + inc_len) = '\0'; |
480 inc = buffer + x; |
480 inc = buffer + x; |
481 } |
481 } |
482 } |
482 } |
483 //read past new line now.. |
483 //read past new line now.. |
484 for(; x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x); |
484 for(; x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x) ; |
485 ++line_count; |
485 ++line_count; |
486 } else if(file->type == QMakeSourceFileInfo::TYPE_QRC) { |
486 } else if(file->type == QMakeSourceFileInfo::TYPE_QRC) { |
487 } else if(file->type == QMakeSourceFileInfo::TYPE_C) { |
487 } else if(file->type == QMakeSourceFileInfo::TYPE_C) { |
488 for(int beginning=1; x < buffer_len; ++x) { |
488 for(int beginning=1; x < buffer_len; ++x) { |
489 // whitespace comments and line-endings |
489 // whitespace comments and line-endings |
492 // keep going |
492 // keep going |
493 } else if(*(buffer+x) == '/') { |
493 } else if(*(buffer+x) == '/') { |
494 ++x; |
494 ++x; |
495 if(buffer_len >= x) { |
495 if(buffer_len >= x) { |
496 if(*(buffer+x) == '/') { //c++ style comment |
496 if(*(buffer+x) == '/') { //c++ style comment |
497 for(; x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x); |
497 for(; x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x) ; |
498 beginning = 1; |
498 beginning = 1; |
499 } else if(*(buffer+x) == '*') { //c style comment |
499 } else if(*(buffer+x) == '*') { //c style comment |
500 for(++x; x < buffer_len; ++x) { |
500 for(++x; x < buffer_len; ++x) { |
501 if(*(buffer+x) == '*') { |
501 if(*(buffer+x) == '*') { |
502 if(x < buffer_len-1 && *(buffer + (x+1)) == '/') { |
502 if(x < buffer_len-1 && *(buffer + (x+1)) == '/') { |
556 while(x+keyword_len < buffer_len) { |
556 while(x+keyword_len < buffer_len) { |
557 if(((*(buffer+x+keyword_len) < 'a' || *(buffer+x+keyword_len) > 'z')) && |
557 if(((*(buffer+x+keyword_len) < 'a' || *(buffer+x+keyword_len) > 'z')) && |
558 *(buffer+x+keyword_len) != '_') { |
558 *(buffer+x+keyword_len) != '_') { |
559 for(x+=keyword_len; //skip spaces after keyword |
559 for(x+=keyword_len; //skip spaces after keyword |
560 x < buffer_len && (*(buffer+x) == ' ' || *(buffer+x) == '\t'); |
560 x < buffer_len && (*(buffer+x) == ' ' || *(buffer+x) == '\t'); |
561 x++); |
561 x++) ; |
562 break; |
562 break; |
563 } else if(qmake_endOfLine(*(buffer+x+keyword_len))) { |
563 } else if(qmake_endOfLine(*(buffer+x+keyword_len))) { |
564 x += keyword_len-1; |
564 x += keyword_len-1; |
565 keyword_len = 0; |
565 keyword_len = 0; |
566 break; |
566 break; |
592 if(term) |
592 if(term) |
593 x++; |
593 x++; |
594 |
594 |
595 int msg_len; |
595 int msg_len; |
596 for(msg_len = 0; (term && *(buffer + x + msg_len) != term) && |
596 for(msg_len = 0; (term && *(buffer + x + msg_len) != term) && |
597 !qmake_endOfLine(*(buffer + x + msg_len)); ++msg_len); |
597 !qmake_endOfLine(*(buffer + x + msg_len)); ++msg_len) ; |
598 *(buffer + x + msg_len) = '\0'; |
598 *(buffer + x + msg_len) = '\0'; |
599 debug_msg(0, "%s:%d %s -- %s", file->file.local().toLatin1().constData(), line_count, keyword, buffer+x); |
599 debug_msg(0, "%s:%d %s -- %s", file->file.local().toLatin1().constData(), line_count, keyword, buffer+x); |
600 x += msg_len; |
600 x += msg_len; |
601 } else if(*(buffer+x) == '\'' || *(buffer+x) == '"') { |
601 } else if(*(buffer+x) == '\'' || *(buffer+x) == '"') { |
602 const char term = *(buffer+(x++)); |
602 const char term = *(buffer+(x++)); |
704 if(fd == -1 || fstat(fd, &fst) || S_ISDIR(fst.st_mode)) |
704 if(fd == -1 || fstat(fd, &fst) || S_ISDIR(fst.st_mode)) |
705 return false; //shouldn't happen |
705 return false; //shouldn't happen |
706 buffer = getBuffer(fst.st_size); |
706 buffer = getBuffer(fst.st_size); |
707 for(int have_read = buffer_len = 0; |
707 for(int have_read = buffer_len = 0; |
708 (have_read = QT_READ(fd, buffer + buffer_len, fst.st_size - buffer_len)); |
708 (have_read = QT_READ(fd, buffer + buffer_len, fst.st_size - buffer_len)); |
709 buffer_len += have_read); |
709 buffer_len += have_read) ; |
710 QT_CLOSE(fd); |
710 QT_CLOSE(fd); |
711 } |
711 } |
712 |
712 |
713 debug_msg(2, "findMocs: %s", file->file.local().toLatin1().constData()); |
713 debug_msg(2, "findMocs: %s", file->file.local().toLatin1().constData()); |
714 int line_count = 1; |
714 int line_count = 1; |
718 for(int x = 0; x < buffer_len; x++) { |
718 for(int x = 0; x < buffer_len; x++) { |
719 if(*(buffer + x) == '/') { |
719 if(*(buffer + x) == '/') { |
720 ++x; |
720 ++x; |
721 if(buffer_len >= x) { |
721 if(buffer_len >= x) { |
722 if(*(buffer + x) == '/') { //c++ style comment |
722 if(*(buffer + x) == '/') { //c++ style comment |
723 for(;x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x); |
723 for(;x < buffer_len && !qmake_endOfLine(*(buffer + x)); ++x) ; |
724 } else if(*(buffer + x) == '*') { //c style comment |
724 } else if(*(buffer + x) == '*') { //c style comment |
725 for(++x; x < buffer_len; ++x) { |
725 for(++x; x < buffer_len; ++x) { |
726 if(*(buffer + x) == 't' || *(buffer + x) == 'q') { //ignore |
726 if(*(buffer + x) == 't' || *(buffer + x) == 'q') { //ignore |
727 if(buffer_len >= (x + 20) && |
727 if(buffer_len >= (x + 20) && |
728 !strncmp(buffer + x + 1, "make ignore Q_OBJECT", 20)) { |
728 !strncmp(buffer + x + 1, "make ignore Q_OBJECT", 20)) { |