program EditBufferDemo;

uses
  crt;

const
  MaxLines = 333;

type
  TStringArray = array[-1..MaxLines] of string;

var
  line: TStringArray;
  lineCount: integer;   { Number of active lines in buffer }
  curLine: integer;     { Current line index }

{-------------------------------------------------------------}
procedure InitBuffer;
var
  i: integer;
begin
  for i := -1 to MaxLines do
    line[i] := '';
  lineCount := 0;
  curLine := 0;
end;

{-------------------------------------------------------------}
procedure InsertLine(const newText: string);
var
  i: integer;
begin
  if lineCount >= MaxLines then
  begin
    writeln('Buffer full. Cannot insert.');
    exit;
  end;

  { Shift lines down from the bottom to curLine }
  for i := lineCount downto curLine do
    line[i + 1] := line[i];

  line[curLine] := newText;
  inc(lineCount);
end;

{-------------------------------------------------------------}
procedure DeleteLine;
var
  i: integer;
begin
  if (lineCount = 0) or (curLine >= lineCount) then
  begin
    writeln('No line to delete.');
    exit;
  end;

  { Shift lines up from curLine+1 to end }
  for i := curLine to lineCount - 1 do
    line[i] := line[i + 1];

  line[lineCount] := '';  { Clear last slot }
  dec(lineCount);

  { Adjust curLine if it was at the end }
  if curLine >= lineCount then
    curLine := lineCount - 1;
end;

{-------------------------------------------------------------}
procedure ShowBuffer;
var
  i: integer;
begin
  writeln('--- Buffer Content ---');
  for i := 0 to lineCount - 1 do
  begin
    if i = curLine then
      write('> ')  { Mark current line }
    else
      write('  ');
    writeln(line[i]);
  end;
  writeln('----------------------');
end;

{-------------------------------------------------------------}
var
  ch: char;
  temp: string;
begin
  clrscr;
  InitBuffer;

  repeat
    ShowBuffer;
    writeln('I=Insert, D=Delete, U=Up, N=Down, Q=Quit');
    ch := upcase(readkey);
    case ch of
      'I':
        begin
          write('Enter new line: ');
          readln(temp);
          InsertLine(temp);
        end;
      'D': DeleteLine;
      'U': if curLine > 0 then dec(curLine);
      'N': if curLine < lineCount - 1 then inc(curLine);
    end;
    clrscr;
  until ch = 'Q';
end.
