디시인사이드 갤러리

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

갤러리 본문 영역

Ada 코드 다시..

나르시갤로그로 이동합니다. 2025.07.22 23:58:25
조회 50 추천 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 - -
2874625 고죠사또롱 vs 학교괴담 여주 ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.25 52 0
2874624 도로롱.. 드디어 내일이야.. 기다려줘.. [3] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.25 56 0
2874623 지하철역에 칼잡이 또 떴다고한다 [2] 헬마스터갤로그로 이동합니다. 07.25 67 0
2874622 정부, 전국민 SW 패치 자동 업데이트 추진…해킹 취약점 대응 발명도둑잡기(118.216) 07.25 63 1
2874620 후우 오랜만에 수학 공부하니까 [4] 어린이노무현갤로그로 이동합니다. 07.25 83 0
2874618 주작기는 무료로 되겠지. 근데 도배기랑 역류기는 글 한페이지 도배를 [1] ㅆㅇㅆ(124.216) 07.25 90 0
2874617 정확히정리해줌 무료프록시되는거:존재함 하지만 소수 유료프록시:안정 [4] ㅇㅇ(106.102) 07.25 108 0
2874616 아니, 그냥 단순하게 도배기랑 역류기 원리만 봐도 유료프록시인거 알텐데 [1] ㅆㅇㅆ(124.216) 07.25 53 0
2874615 무료프록시도 되는건존재함 애옹이한테물어봤었음 [2] ㅇㅇ(106.102) 07.25 83 0
2874614 무료프록시잘만되는데 저능아라 만들어본적도없으면서 뇌피셜 ㅆㅎㅌㅊ노 ㅇㅇ(118.37) 07.25 38 0
2874612 진짜 굳이 커뮤하나때문에 주작기까지쳐만드는새끼들은ㅇㅇㅇ [2] ㅇㅇ(106.102) 07.25 60 1
2874611 지금 도배기랑 역류기 만드는 애들한테 사면 다 유료 프록시하라는데 [1] ㅆㅇㅆ(124.216) 07.25 41 0
2874610 외모가 떨어지는 사람이 더 공격적이라는 심리학 연구 있나 [1] 발명도둑잡기(118.216) 07.25 43 0
2874609 초전도드래곤 행성이한테 물어보면되는데 왜지들끼리 쳐싸우노 [2] ㅇㅇ(211.36) 07.25 75 0
2874608 더워서 밖엘 못나가겠다..ㅇㅅㅇ 헤르 미온느갤로그로 이동합니다. 07.25 25 0
2874607 무료프록시잘되는데 저능아고 프알못이라 만들어본적도없으니 [1] ㅇㅇ(118.37) 07.25 40 0
2874606 병신들 자강두천 또시작했노 [1] ㅇㅇ(106.102) 07.25 35 0
2874605 디시인사이드 도배는 https 요청인데 뭔 씨발 무료 프록시가 되고 ㅆㅇㅆ(124.216) 07.25 54 0
2874604 금쪽이 처음나올때부터 ㅈ같았는데 볼게없어서 금쪽이를 보게됨 [1] 뒷통수한방(1.213) 07.25 33 0
2874603 무료프록시잘되는데 능력없는 저능아라 만들지도못하네 [4] ㅇㅇ(118.37) 07.25 60 0
2874602 나님 애니보면서 주무싶니댱⭐+ ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.25 33 0
2874601 https 기반 프록시는 대부분 유료 프록시인데 뭔 무료가 돼 ㅆㅇㅆ(124.216) 07.25 39 0
2874600 이게 사실이면.. 빅브라더 완성인데? 손발이시립디다갤로그로 이동합니다. 07.25 38 0
2874599 ㅆㅇㅆ징:지가능력없고저능아라 못만드는걸 프록시탓만함 [8] ㅇㅇ(118.37) 07.25 91 0
2874598 중국이 틱톡으로 힙합 트렌드 좌우? [1] 발명도둑잡기(118.216) 07.25 39 0
2874597 지금 도배 역류기 https 써야해서 유료 프록시일텐데 ㅆㅇㅆ찡갤로그로 이동합니다. 07.25 43 0
2874596 왜 불렁~ 배 불렁~ 배 뽈록~⭐ ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.25 41 0
2874595 이대통령 "12시간 4일연속 이게 가능하냐?" 프갤러(220.85) 07.25 41 0
2874594 석열이란 이름 자체가 10만원 전국민 지원금 줄 운명이다 발명도둑잡기(118.216) 07.25 32 0
2874591 국가보안법과 음악 관련 영화 [1] 발명도둑잡기(118.216) 07.25 34 0
2874587 신태일씨 브베 떡방송 보며 탄식햇던게 엊그제같은데 헬마스터갤로그로 이동합니다. 07.25 51 0
2874585 믿기지 않는 이야기지만 2025년 한국에서 벌어지는 일입니다 발명도둑잡기(118.216) 07.25 27 0
2874583 대부분 사람들이 잘 모르는 주초와 주말의 관계 발명도둑잡기(118.216) 07.25 29 0
2874579 주말을 맞이할 준비가 되었나요? [2] 개멍청한유라갤로그로 이동합니다. 07.25 45 0
2874576 나님 끙야즁⭐+ [1] ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.25 37 0
2874574 커서 비싸졌다는 평 발명도둑잡기(118.216) 07.25 55 0
2874573 커서 200불짜리 질렀는데 하루만에 경고 날라왔다 [1] 프갤러(1.249) 07.25 51 0
2874572 김성수 장대호는 전생에 뭔지랄을했길래 좇센에서 태어났을까 뒷통수한방(1.213) 07.25 32 0
2874571 원피스 판타지를 능가하는 현실 최고의 선장은 발명도둑잡기(118.216) 07.25 29 0
2874569 음악 장르 다양성 연구 발명도둑잡기(118.216) 07.25 30 0
2874568 제미나이 프로 4개월 할인권 ㅇㅇ(211.236) 07.25 44 0
2874567 로자룩셈부르크 갤러리 글 발명도둑잡기(118.216) 07.25 39 0
2874565 윤석열 각하도 전국민 민생회복지원금 지원 중 발명도둑잡기(118.216) 07.25 53 0
2874564 오 이거 뭐지 3일 전에 산건대 15배오름 [2] 어린이노무현갤로그로 이동합니다. 07.25 65 0
2874560 왔따! 인간남녀! ♥팬티스타킹냥덩♥갤로그로 이동합니다. 07.25 40 0
2874559 공수처 검찰청 경찰청 국제수사 과학수사 포랜식수사 기무사 국정원 존재이유 뒷통수한방(1.213) 07.25 33 0
2874556 우리 농산어촌은 동학운동 하듯이 지켜야 한다 발명도둑잡기(118.216) 07.25 30 0
2874554 재명지원금땜에 돼지되게 생겻다 [3] 헬마스터갤로그로 이동합니다. 07.25 53 0
2874553 ㄳㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷㄷ 프갤러(61.73) 07.25 66 0
2874551 AI 로 모든 직업이 사라질거야 [1] ㅇㅇ(183.101) 07.25 64 0
뉴스 코치, 더현대 서울에 매장 오픈...투모로우바이투게더의 태현·휴닝카이·채수빈·이즈나(izna)·마이 등 참석 디시트렌드 07.28
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2