디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

Ada 코드 다시..

나르시갤로그로 이동합니다. 2025.07.22 23:58:25
조회 52 추천 1 댓글 0

Ada 코드입니다.


Cada는 C - Ada 바딩인 라이브러리입니다.


재업 완료

ㅋㅋㅋ


여신






with System;

with Interfaces.C;

with Cada.Types;

with Cada.Error;

with sys_stat_h;

with sys_types_h;

with System.Storage_Elements;

with errno_h;

with unistd_h;


package body Cada.File is

  use type Interfaces.C.Int;

  use type Interfaces.C.long;


  function c_open2 (path  : Interfaces.C.Char_Array;

                    flags : Interfaces.C.Int) return File_Descriptor;

  function c_open3 (path  : Interfaces.C.Char_Array;

                    flags : Interfaces.C.Int;

                    mode  : sys_types_h.mode_t) return File_Descriptor;

  pragma import (c, c_open2, "open");

  pragma import (c, c_open3, "open");


  function open (path  : String;

                 flags : File_Flags) return Object is

    new_fd : constant File_Descriptor :=

      c_open2 (Interfaces.C.to_c (path), Interfaces.C.Int (flags));

  begin

    if new_fd = -1 then

      declare

        error_code : constant Interfaces.C.int := Cada.Error.get_errno;

        error_msg  : constant String           :=

          "open(2) failed for path """ & path & """ (errno: " & error_code'image & ")";

      begin

        case error_code is

          when errno_h.EACCES =>

            raise Cada.Error.Permission_Denied with error_msg;

          when errno_h.ENOENT =>

            raise Cada.Error.No_Such_File_Or_Directory with error_msg;

          when errno_h.EEXIST =>

            raise Cada.Error.File_Exists with error_msg;

          when errno_h.EISDIR =>

            raise Cada.Error.Is_A_Directory with error_msg;

          when errno_h.ENOTDIR =>

            raise Cada.Error.Not_A_Directory with error_msg;

          when others =>

            declare

              errno_text : constant String := Cada.Error.get_error_message(error_code);

            begin

              raise Cada.Error.Unknown_Error with errno_text & ": " & error_msg;

            end;

        end case;

      end;

    end if;

    return (Ada.Finalization.Controlled with fd => new_fd);

  end open;


  -- open implementation (3 arguments)

  function open (path  : String;

                 flags : File_Flags;

                 mode  : Cada.Types.File_Mode) return Object is

    new_fd : constant File_Descriptor := c_open3 (Interfaces.C.to_c (path),

                                                  Interfaces.C.Int (flags),

                                                  sys_types_h.mode_t (mode));

  begin

    if new_fd = -1 then

      declare

        error_code : constant Interfaces.C.int := Cada.Error.get_errno;

        error_msg  : constant String           :=

          "open(2) failed for path """ & path & """ (errno: " & error_code'image & ")";

      begin

        case error_code is

          when errno_h.EACCES =>

            raise Cada.Error.Permission_Denied with error_msg;

          when errno_h.ENOENT =>

            raise Cada.Error.No_Such_File_Or_Directory with error_msg;

          when errno_h.EEXIST =>

            raise Cada.Error.File_Exists with error_msg;

          when errno_h.EISDIR =>

            raise Cada.Error.Is_A_Directory with error_msg;

          when errno_h.ENOTDIR =>

            raise Cada.Error.Not_A_Directory with error_msg;

          when others =>

            declare

              errno_text : constant String := Cada.Error.get_error_message(error_code);

            begin

              raise Cada.Error.Unknown_Error with errno_text & ": " & error_msg;

            end;

        end case;

      end;

    end if;

    return (Ada.Finalization.Controlled with fd => new_fd);

  end open;


  procedure close (self : in out Object) is

    result : constant Interfaces.C.int := unistd_h.close (Interfaces.C.Int (self.fd));

  begin

    if result = -1 then

      -- Embed the error handling logic directly.

      declare

        error_code : constant Interfaces.C.int := Cada.Error.get_errno;

        error_msg  : constant String           :=

          "close(2) failed for fd " & self.fd'image &

          " (errno: " & error_code'image & ")";

      begin

        case error_code is

          when errno_h.EBADF => -- Bad file descriptor

            raise Cada.Error.Bad_File_Descriptor with error_msg;

          when errno_h.EINTR => -- Interrupted system call

            raise Cada.Error.Interrupted_System_Call with error_msg;

          when errno_h.EIO =>   -- I/O error

            raise Cada.Error.Input_Output_Error with error_msg;

          when others =>

            declare

              errno_text : constant String := Cada.Error.get_error_message(error_code);

            begin

              raise Cada.Error.Unknown_Error with errno_text & ": " & error_msg;

            end;

        end case;

      end;

    end if;

    self.fd := -1;

  end close;


  function write (self   : in Object;

                  buffer : in System.Storage_Elements.Storage_Array)

    return Natural is

    bytes_written : constant sys_types_h.ssize_t :=

      unistd_h.write (Interfaces.C.Int (self.fd),

                      buffer'address, buffer'length);

  begin

    if bytes_written = -1 then

      -- [!] 오류 처리 로직을 내부에 직접 작성

      declare

        error_code : constant Interfaces.C.int := Cada.Error.get_errno;

        error_msg  : constant String           :=

          "write(2) failed for fd " & self.fd'image &

          " (errno: " & error_code'image & ")";

      begin

        case error_code is

          when errno_h.EBADF => -- Bad file descriptor

            raise Cada.Error.Bad_File_Descriptor with error_msg;

          when errno_h.EPIPE => -- Broken pipe

            raise Cada.Error.Broken_Pipe with error_msg;

          when errno_h.EINTR => -- Interrupted system call

            raise Cada.Error.Interrupted_System_Call with error_msg;

          when errno_h.EAGAIN => -- (or EWOULDBLOCK) Resource temporarily unavailable

            raise Cada.Error.Resource_Temporarily_Unavailable with error_msg;

          when errno_h.EFBIG => -- File too large

            raise Cada.Error.File_Too_Large with error_msg;

          when others =>

            declare

              errno_text : constant String := Cada.Error.get_error_message(error_code);

            begin

              raise Cada.Error.Unknown_Error with errno_text & ": " & error_msg;

            end;

        end case;

      end;

    end if;

    return Natural (bytes_written);

  end write;


  function duplicate (self : in Object) return Object is

    new_fd : constant File_Descriptor :=

      File_Descriptor (unistd_h.dup (Interfaces.C.Int (self.fd)));

  begin

    if new_fd = -1 then

      declare

        error_code : constant Interfaces.C.int := Cada.Error.get_errno;

        error_msg  : constant String           :=

          "dup(2) failed for fd " & self.fd'image &

          " (errno: " & error_code'image & ")";

      begin

        case error_code is

          when errno_h.EBADF =>   -- Bad file descriptor

            raise Cada.Error.Bad_File_Descriptor with error_msg;

          when errno_h.EINTR =>   -- Interrupted system call

            raise Cada.Error.Interrupted_System_Call with error_msg;

          when errno_h.EMFILE =>  -- Per-process limit on open file descriptors reached

            raise Cada.Error.Too_Many_Open_Files with error_msg;

          when others =>

            declare

              errno_text : constant String := Cada.Error.get_error_message(error_code);

            begin

              raise Cada.Error.Unknown_Error with errno_text & ": " & error_msg;

            end;

        end case;

      end;

    end if;


    return (Ada.Finalization.Controlled with fd => new_fd);

  end duplicate;


  function duplicate_to (self   : in Object;

                         new_fd : File_Descriptor)

    return Object is

    result_fd : constant File_Descriptor :=

      File_Descriptor (unistd_h.dup2 (Interfaces.C.Int (self.fd),

                                      Interfaces.C.Int (new_fd)));

  begin

    if result_fd = -1 then

      declare

        error_code : constant Interfaces.C.int := Cada.Error.get_errno;

        error_msg  : constant String           :=

          "dup2(2) failed for old_fd " & self.fd'image & " to new_fd " &

          new_fd'image & " (errno: " & error_code'image & ")";

      begin

        case error_code is

          when errno_h.EBADF => -- Bad file descriptor

            raise Cada.Error.Bad_File_Descriptor with error_msg;

          when errno_h.EINTR => -- Interrupted system call

            raise Cada.Error.Interrupted_System_Call with error_msg;

          when errno_h.EBUSY => -- (Linux-specific) Race condition detected

            raise Cada.Error.Device_Busy with error_msg;

          when others =>

            declare

              errno_text : constant String := Cada.Error.get_error_message(error_code);

            begin

              raise Cada.Error.Unknown_Error with errno_text & ": " & error_msg;

            end;

        end case;

      end;

    end if;


    return (Ada.Finalization.Controlled with fd => result_fd);

  end duplicate_to;


  function umask (new_mask : Cada.Types.File_Mode)

    return Cada.Types.File_Mode is

    mode : constant sys_types_h.mode_t :=

      sys_stat_h.umask (sys_types_h.mode_t (new_mask));

  begin

    return Cada.Types.File_Mode (mode);

  end umask;


  overriding

  procedure finalize (self : in out Object) is

  begin

    if self.fd /= -1 then

      -- finalize에서는 예외를 전파하지 않는 것이 좋으므로,

      -- 오류 발생 가능성이 있는 호출은 블록으로 감쌉니다.

      declare

        result : Interfaces.C.Int :=

          unistd_h.close (Interfaces.C.Int (self.fd));

      begin

        if result /= 0 then

           null; -- 오류를 무시하거나 내부 로그로 기록

        end if;

      end;

      self.fd := -1;

    end if;

  end finalize;


end Cada.File;

추천 비추천

1

고정닉 0

0

댓글 영역

전체 댓글 0
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 반응이 재밌어서 자꾸만 놀리고 싶은 리액션 좋은 스타는? 운영자 25/07/28 - -
AD 휴대폰 액세서리 세일 중임! 운영자 25/07/28 - -
공지 프로그래밍 갤러리 이용 안내 [92] 운영자 20.09.28 45937 65
2876968 즐거움에는 괴로움이 따른다. ㅇㅇ(183.101) 04:01 7 0
2876966 욕구로부터 자유로워지면 즐거움도 괴로움도 사라진다. ㅇㅇ(183.101) 04:01 7 0
2876946 “동남아요? 한국입니다” 서울에 ‘바나나’ 주렁주렁 발명도둑잡기(118.216) 03:13 11 0
2876939 큐레이터 기피 대상 1호 한스 하케의 ‘아이스테이블’ 발명도둑잡기(118.216) 02:59 11 0
2876936 [중앙시평] 중국의 기술 굴기가 가져올 파장들 발명도둑잡기(118.216) 02:55 10 0
2876934 가자 아사자 속출, 폭주하는 네타냐후 발명도둑잡기(118.216) 02:29 15 0
2876932 모든 고통이 트라우마 속으로..새 책 '트라우마의 제국' 발명도둑잡기(118.216) 02:14 10 0
2876930 오늘의 작사 실마리: 국가음식원탑, 미국음식판매빌보드차트 발명도둑잡기(118.216) 02:07 12 0
2876929 '키세스 시위대'와 아폴로11호, 이재명노믹스의 관계는… 발명도둑잡기(118.216) 02:03 12 0
2876928 에픽하이-Lesson 3 (MC) 발명도둑잡기(118.216) 01:46 12 0
2876927 아 내일까지 납품인데 솔직히 존나 하기 싫다 [2] ㅆㅇㅆ(124.216) 01:41 28 0
2876920 대만 야당 의원 파면투표 전원 부결…'친미' 집권당 위기 발명도둑잡기(118.216) 01:21 13 0
2876919 토스 모범답안 코드는 코틀린 코드가 아니라 자바 코드임 ㅆㅇㅆ(124.216) 01:21 25 0
2876916 대만-한국, 두 나라 반도체노동자들은 정말 괜찮은 걸까 발명도둑잡기(118.216) 01:19 12 0
2876910 내 생각은 그럼, 결국 테스트 저거는 암기영역이니 ㅆㅇㅆ(124.216) 01:09 19 0
2876908 코테 문제들 보는데 애초에 도메인 관점에서 짜면 안되는 코드를 ㅆㅇㅆ(124.216) 01:04 32 0
2876907 코틀린 코드가 뭔가 해서 보는데 이것도 걍 C스타일이든데 ㅆㅇㅆ(124.216) 01:02 31 1
2876906 토스가 짜라는 코드 보는데 걍 시간 아깝던데 ㅆㅇㅆ(124.216) 00:57 25 0
2876905 토스 코테 보는데 저렇게 코드짜면 솔직히 좀 애매하던데 [4] ㅆㅇㅆ(124.216) 00:53 57 0
2876904 토스가 예전에 자기들코테 모범답안이라고 올린거보니 현타옴 [4] 밀우갤로그로 이동합니다. 00:50 45 0
2876903 흔히들 공산주의가 되면 배급이 전부 나뉘어서 노력 안한다하는데 ㅆㅇㅆ(124.216) 00:49 16 0
2876902 애초에 자본주의 체제의 모순점을 학문으로 정립한게 공산주의긴함 ㅆㅇㅆ(124.216) 00:43 18 0
2876897 로마 공화정은 심각한 빈부격차로 망했다고 함 [10] 아스카영원히사랑해갤로그로 이동합니다. 00:24 55 0
2876896 얼마 전에 행사 홈페이지 돈 받고 제작해줬는데 [1] ㅇㅇ갤로그로 이동합니다. 00:15 26 0
2876894 오늘의 발명, 소설, 영화 실마리: 비밀 발명도둑잡기(118.216) 07.31 15 0
2876893 운전병 존나 억울한게 프갤에서만 꿀이라는 이미지가 강함 ㅇㅇ(211.193) 07.31 18 0
2876892 우리를 덥게 만드는 사람들은 누구일까요? 발명도둑잡기(118.216) 07.31 18 0
2876891 도서관에서 북캉스 어때요…서울시 '도서관은 쿨하다' 캠페인 발명도둑잡기(118.216) 07.31 14 0
2876889 과도한 부는 비도덕적?…"GDP·사회평등 등에 따라 인식 달라" 발명도둑잡기(118.216) 07.31 15 0
2876888 할리우드 스타 엠마 왓슨 친팔레스타인 SNS, 이스라엘 인사들 몽니 발명도둑잡기(118.216) 07.31 18 0
2876887 지금 40대 1995년 사진 발명도둑잡기(118.216) 07.31 26 0
2876885 “탄핵 반대해도 찍어준다, 국민은 1년 후면 달라져” 윤상현 발언 논란 발명도둑잡기(118.216) 07.31 20 0
2876884 캐나다도 팔레스타인 국가로 인정…트럼프 "무역협정 어려워져" 발명도둑잡기(118.216) 07.31 15 0
2876883 무인기 침투 의혹에 “윤석열, 사형뿐인 불법전투개시죄 적용 가능” 발명도둑잡기(118.216) 07.31 15 0
2876879 중국, 3차 관세협상 “성공했다” 평가…미국 기업에는 “중국에 투자하라” 발명도둑잡기(118.216) 07.31 14 0
2876876 사이카는 예술 같다. SONE-763 허베이 아야카 너무 좋다. 넥도리아(220.74) 07.31 21 0
2876875 미국 농축산물 품질은 중국 알리익스프레스 공산품 품질 수준 발명도둑잡기(118.216) 07.31 12 0
2876873 월 200충임 ㅇㅅㅇ [1] 류류(118.235) 07.31 55 1
2876871 항해 플러스를 시작하고 [2] 어린이노무현갤로그로 이동합니다. 07.31 45 1
2876870 오히려 자기가 너무 좋아하면 매몰되는 경우가 부지기수임 [2] ㅆㅇㅆ(124.216) 07.31 47 0
2876868 나는 게임 싫어해도 게임 잘만들 수 있다 생각함. 문제는 이거임 [1] ㅆㅇㅆ(124.216) 07.31 36 0
2876866 "미국판 문화대혁명"…트럼프 행보에 마오 떠올리는 중국인, 왜 발명도둑잡기(118.216) 07.31 14 0
2876865 에픽 ceo가 개발자로는 훌륭한데 게임에 관심없는 사람인게 너무 싫다 [3] ㅇㅇ(122.36) 07.31 54 0
2876862 가끔 도메인을 뭐라고 생각하는지 모르겠네 애들이 ㅆㅇㅆ(124.216) 07.31 34 0
2876859 냥덩이 이민가고 한국인들 공격하다가 5년뒤 한국 국적 포기 예정 [1] 발명도둑잡기(118.216) 07.31 35 0
2876858 나님 주무시기전 소통⭐+ 질문 받음 [1] ♥복잡미묘냥덩♥갤로그로 이동합니다. 07.31 31 0
2876854 언어든 도메인이든 하나만 파는게 실력에는 더 도움됨 [1] ㅇㅇ(122.36) 07.31 39 0
2876852 하루 한 번 헤르미온느 발명도둑잡기(118.216) 07.31 19 0
2876850 ❤✨☀⭐⚡☘⛩나님 시작합니당⛩☘⚡⭐☀✨❤ ♥복잡미묘냥덩♥갤로그로 이동합니다. 07.31 18 0
뉴스 결혼 발표한 ‘신화’ 이민우, 뒤늦게 알려진 ‘결별 소식’ 디시트렌드 07.31
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2