Кресты / Говнокод #28109 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  10. 10
  11. 11
  12. 12
  13. 13
  14. 14
  15. 15
  16. 16
  17. 17
  18. 18
  19. 19
  20. 20
  21. 21
  22. 22
  23. 23
  24. 24
  25. 25
  26. 26
  27. 27
  28. 28
  29. 29
  30. 30
  31. 31
  32. 32
  33. 33
  34. 34
  35. 35
  36. 36
  37. 37
  38. 38
  39. 39
  40. 40
  41. 41
  42. 42
  43. 43
  44. 44
  45. 45
  46. 46
  47. 47
  48. 48
  49. 49
  50. 50
  51. 51
  52. 52
  53. 53
  54. 54
  55. 55
  56. 56
// https://github.com/santiontanon/stransball2/blob/dff413c6ed236b4be23e0152557a26d7d902976c/sources/state_changepack.cpp#L67

bool state_changepack_cycle(SDL_Surface *screen,int sx,int sy,unsigned char *keyboard)
{
	if (SUBSTATE==0) {
		if (image!=0) SDL_FreeSurface(image);
		image=IMG_Load("graphics/tittle.pcx");

		{
			levelpacks.Delete();
                                                         
#ifdef _WIN32
                        /* Find files: */ 
                        WIN32_FIND_DATA finfo;
                        HANDLE h;

                        h=FindFirstFile("maps/*.lp",&finfo);
                        if (h!=INVALID_HANDLE_VALUE) {
                                char *tmp;

                                tmp=new char[strlen(finfo.cFileName)+1];
                                strcpy(tmp,finfo.cFileName);
                                levelpacks.Add(tmp);

                                while(FindNextFile(h,&finfo)==TRUE) {
                                    char *tmp;

                                    tmp=new char[strlen(finfo.cFileName)+1];
                                    strcpy(tmp,finfo.cFileName);
                                    levelpacks.Add(tmp);
                                } /* while */ 
                        } /* if */ 
#else
                        DIR *dp;
                        struct dirent *ep;
		  
                        dp = opendir ("maps");
                        if (dp != NULL)
                        {
                            while (ep = readdir (dp))
                            {
                                char *tmp;
                         
                                if (strlen(ep->d_name)>4 &&
                                    ep->d_name[strlen(ep->d_name)-3]=='.' &&
                                    ep->d_name[strlen(ep->d_name)-2]=='l' &&
                                    ep->d_name[strlen(ep->d_name)-1]=='p') {
                                    tmp=new char[strlen(ep->d_name)+1];
                                    strcpy(tmp,ep->d_name);
                                    levelpacks.Add(tmp);                                    
                                } /* if */
                               
                            }
                            (void) closedir (dp);
                        }
#endif

Super Transball 2 (супер трансшары 2)

Запостил: j123123 j123123, (Updated )

Комментарии (44) RSS

  • Вот бля как надо расширение файлов проверять:
    if (strlen(ep->d_name)>4 &&
        ep->d_name[strlen(ep->d_name)-3]=='.' &&
        ep->d_name[strlen(ep->d_name)-2]=='l' &&
        ep->d_name[strlen(ep->d_name)-1]=='p') {
    Ответить
    • Интересно, а есть ли в крестах особый говнометод для строк, чтоб совпадения такой-то хуйни с конца проверять?
      Ответить
      • я не попенгаген, но кажется есть обратные итераторы втч и у строк
        Ответить
          • во-первых есть обратный итератор, но это ебля
            во-вторых есть substr
            Грубо гря
            bool has_extension(const std::string& file, const std::string& ext)
            	{
            		if (file.length() <= (ext.length() + 1))
            		{
            			return false;
            		}
            		const auto offset = file.length() - ext.length();
            		return file[offset - 1] == '.' && file.substr(offset) == ext;
            	}
            Ответить
        • И почему это какая-то завязанная на "string" херня? Если я например хочу в std::vector<int> сравнить 5 последних хуйни, мне нужно какое-то другое говно использовать, да?
          Ответить
          • template <class T>
            	bool ends_with(T const& value, T const& ending)
            	{
            		if (ending.size() > value.size()) return false;
            		return std::equal(ending.rbegin(), ending.rend(), value.rbegin());
            	}


            stl, итераторы и шаблоны
            Ответить
              • Наверное правильнее спросить почему вообще строки не частный случай коллекции с кодпоинтами. Кажется, для строк можно делать какие-то оптимизации, но это не точно. *

                Я не крестовик же, нужно Госта спросить, или Борманда.

                Вангую, что строки Страуструп сделал раньше, чем Степанов свои коллекции



                * кстати, анекдот на эту тему: ответить без гугла чем отличаются методы length() и size() у строки?
                Ответить
                • вот тут про это пиздят
                  https://stackoverflow.com/questions/11358879/benefits-of-vectorchar-over-string

                  упомянутая мною оптимизация это small string optimization
                  Остальное ридабилити

                  В общем С++ это такой странный мир, где зачем-то есть vector<bool>, а строки развиваются параллельно с контейнерами, но при этом это и не строки вовсе, а тоже контейнеры со спец типами типа чар (в смысле строки не понимают там всякие юникоды)

                  Ситуация напоминает как в жабе есть 100500 фреймворков для логирования, например


                  зы: блядь как пиздато опять пиздеть про С++, а не про войну
                  Ответить
                • > ответить без гугла чем отличаются методы length() и size() у строки?

                  Ничем. Вообще ничем. Даже для wide и multibyte строк.
                  Ответить
                • Наверное, потому что это оверинжиниринг. Мне не нужны сферические строки в вакууме, мне нужно то, чем я пользуюсь: endsWith, toUpper, toUtf8, strip. А тащить все это в коллекцию общего вида... часто ли для обычного массива нужен endsWith? Если все потенциально полезное для коллекций добавить, то прототип распухнет как руки-базуки...
                  Ответить
                  • Справедливости ради, ends_with общего вида добавили в С++23.

                    С этим, кстати, связано ещё одно говно.
                    С появлением ranges, все алгоритмы переделали на их поддержку. Лежат эти новые алгоритмы в std::ranges::, а старые в std::.
                    Вся новая хуйня добавляется в std::ranges::, её аналог в std:: — нет. То есть, в большинстве случаев если ты напишешь std::huita вместо std::ranges::huita, всё будет работать. Но иногда нет. За 20 лет скопилось огромное количество материала, показывающего, как использовать говно из std::.
                    То есть, кто-нибудь, использующий учебники, написанные лет 5 назад, может хватить неиллюхорный диссонанс, когда в каких-то случаях всё работает, а в каких-то надо впихивать ranges в середину.
                    Задепрекетить все старые алгоритмы с сообщением «пользуйтесь новыми в ranges» не додумались.
                    Ответить
                    • Ну, я взял за образец QString. Там тоже, конечно, бывают неожиданности, когда, например, в QString'е есть number и arg (просто число в строку и умное форматирование, соответственно), а в частенько прикидывающемся однобайтовой строкой QByteArray'е - только number. Но так и надо, наверное...
                      Ответить
                      • QString не std:string же

                        курица не птица
                        болгария не заграница
                        std::string не строка
                        Ответить
              • Ну а нахуя в сишке сделели какой-то strtok, который работает только с массивами чаров? А если я хочу массив интов разбить на группы, что мне делать?
                Тот же самый вопрос про strlen, да и про всю str* серию функций.
                Ответить
                • Потому что в сишке нет говношаблонов, чтобы делать обобщенные хуйни. А делать через коллбеки и указывать размеры хуйни (как в функции qsort() например) это оверхед. У говнокрестов таких оправданий нет.
                  Ответить
    • какой вконтакте
      какой алогоритм Шлемеля зе пейнтера

      >new
      ого, это кресты
      Ответить
        • А вообще что вот должно быть в голове у автора? Как можно смешать win32api, препроцессор, strlen и new?

          Он накопипастил куски кода из разных мест, или это он так "C++" знает?
          Ответить
          • Satan Balls.
            #ifdef _WIN32
             <код под Windows>
            #else
             <кроссплатформенный код>
            #endif

            Хм...
            Ответить
            • Автор наверно сначала написал код под "Windows", потом написал кроссплатформенный код (который и под "Windows" работать будет), но код под "Windows" было жалко выкидывать, и он поэтому его оставил.

              Хотя вот функция opendir() это из "POSIX", в винде такой хуйни вроде нет.
              Ответить
              • Это - магия васкира

                An application cannot create a directory by using CreateFile, therefore only the OPEN_EXISTING value is valid for dwCreationDisposition for this use case. To create a directory, the application must call CreateDirectory or CreateDirectoryEx.

                To open a directory using CreateFile, specify the FILE_FLAG_BACKUP_SEMANTICS flag as part of dwFlagsAndAttributes. Appropriate security checks still apply when this flag is used without SE_BACKUP_NAME and SE_RESTORE_NAME privileges.
                Ответить
      • Урааа! Борманд няприветнулся!
        Ответить
      • Не совсем

        Вконтактники любят конечно писать
        if (petuh[0] == 'h' && petuh[1] == 't' && petuh[2] == 't'

        но Шлёму Зепейнтера они не заказывали
        Ответить
          • В смысле там Шлёмы не будет?
            Ну возможно, но расчитывать не стоит

            Вот кстати крестостроки же вроде свою длину считают один раз, так что они еще и этим лучше
            Ответить
          • Но автор кода то про это не знает
            Ответить
            • У автора кода в голове птички насрали, и я вероятно даже знаю, почему

              В не очень хороших ВУЗах иногда учат си и сразу си++, и в голове образовывается такая вот кашица
              Ответить
    • https://govnokod.ru/23672 тоже проверка расширения файла реализована похожим образом, только strlen на каждую букву не вызывается - оптимизированней!
      Ответить
    • мне еще нравится, что оно взяло Simple DirectMedia Layer, но всё равно прибилось говздями к win32api даже в тех местах, где у крестов есть свои API
      Ответить

Добавить комментарий

Из-за тебя ушел bormand, guest!

    А не использовать ли нам bbcode?


    8