// File: ljl0222[P]SecondFileSystem/INode.cpp
// Function: Inode::ITrunc()
void Inode::ITrunc()
{
	/* ���ɴ��̸��ٻ�����ȡ����һ�μ��ӡ����μ����������Ĵ��̿� */
	BufferManager& bm = globalBufferManager;
	/* ��ȡg_FileSystem���������ã�ִ���ͷŴ��̿��Ĳ��� */
	FileSystem& filesys = globalFileSystem;

	/* ����FILO��ʽ�ͷţ��Ծ���ʹ��SuperBlock�м�¼�Ŀ����̿���������
	 *
	 * Unix V6++���ļ������ṹ��(С�͡����ͺ;����ļ�)
	 * (1) i_addr[0] - i_addr[5]Ϊֱ�����������ļ����ȷ�Χ��0 - 6���̿飻
	 *
	 * (2) i_addr[6] - i_addr[7]����һ�μ������������ڴ��̿��ţ�ÿ���̿�
	 * �ϴ���128���ļ������̿��ţ������ļ����ȷ�Χ��7 - (128 * 2 + 6)���̿飻
	 *
	 * (3) i_addr[8] - i_addr[9]���Ŷ��μ������������ڴ��̿��ţ�ÿ�����μ���
	 * ��������¼128��һ�μ������������ڴ��̿��ţ������ļ����ȷ�Χ��
	 * (128 * 2 + 6 ) < size <= (128 * 128 * 2 + 128 * 2 + 6)
	 */
	for (int i = 9; i >= 0; i--)		/* ��i_addr[9]��i_addr[0] */
	{
		/* ����i_addr[]�е�i���������� */
		if (this->i_addr[i] != 0)
		{
			/* ������i_addr[]�е�һ�μ��ӡ����μ��������� */
			if (i >= 6 && i <= 9)
			{
				/* ���������������뻺�� */
				Buf* pFirstBuf = bm.Bread(this->i_addr[i]);
				/* ��ȡ��������ַ */
				int* pFirst = (int*)pFirstBuf->b_addr;

				/* ÿ�ż�����������¼ 512/sizeof(int) = 128�����̿��ţ�������ȫ��128�����̿� */
				for (int j = 128 - 1; j >= 0; j--)
				{
					if (pFirst[j] != 0)	/* ���������������� */
					{
						/*
						 * ���������μ�����������i_addr[8]��i_addr[9]�
						 * ��ô���ַ�����¼����128��һ�μ������������ŵĴ��̿���
						 */
						if (i >= 8 && i <= 9)
						{
							Buf* pSecondBuf = bm.Bread(pFirst[j]);
							int* pSecond = (int*)pSecondBuf->b_addr;

							for (int k = 128 - 1; k >= 0; k--)
							{
								if (pSecond[k] != 0)
								{
									/* �ͷ�ָ���Ĵ��̿� */
									filesys.Free(pSecond[k]);
								}
							}
							/* ����ʹ�����ϣ��ͷ��Ա㱻��������ʹ�� */
							bm.Brelse(pSecondBuf);
						}
						filesys.Free(pFirst[j]);
					}
				}
				bm.Brelse(pFirstBuf);
			}
			/* �ͷ�����������ռ�õĴ��̿� */
			filesys.Free(this->i_addr[i]);
			/* 0��ʾ����������� */
			this->i_addr[i] = 0;
		}
	}

	/* �̿��ͷ����ϣ��ļ���С���� */
	this->i_size = 0;
	/* ����IUPD��־λ����ʾ���ڴ�Inode��Ҫͬ������Ӧ����Inode */
	this->i_flag |= Inode::IUPD;
	/* �����ļ���־ ��ԭ����RWXRWXRWX����*/
	this->i_mode &= ~(Inode::ILARG);
	this->i_nlink = 1;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x58(%rbp)
leaq 0xbc35(%rip), %rax      # 0x14350
movq %rax, -0x10(%rbp)
leaq 0x1a7b2(%rip), %rax     # 0x22ed8
movq %rax, -0x18(%rbp)
movl $0x9, -0x1c(%rbp)
cmpl $0x0, -0x1c(%rbp)
jl 0x889e
movq -0x58(%rbp), %rax
movslq -0x1c(%rbp), %rcx
cmpl $0x0, 0x20(%rax,%rcx,4)
je 0x888e
cmpl $0x6, -0x1c(%rbp)
jl 0x8866
cmpl $0x9, -0x1c(%rbp)
jg 0x8866
movq -0x58(%rbp), %rax
movslq -0x1c(%rbp), %rcx
movl 0x20(%rax,%rcx,4), %esi
leaq 0xbbdb(%rip), %rdi      # 0x14350
callq 0x3f10
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x30(%rbp)
movl $0x7f, -0x34(%rbp)
cmpl $0x0, -0x34(%rbp)
jl 0x8856
movq -0x30(%rbp), %rax
movslq -0x34(%rbp), %rcx
cmpl $0x0, (%rax,%rcx,4)
je 0x8846
cmpl $0x8, -0x1c(%rbp)
jl 0x882f
cmpl $0x9, -0x1c(%rbp)
jg 0x882f
movq -0x30(%rbp), %rax
movslq -0x34(%rbp), %rcx
movl (%rax,%rcx,4), %esi
leaq 0xbb85(%rip), %rdi      # 0x14350
callq 0x3f10
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x48(%rbp)
movl $0x7f, -0x4c(%rbp)
cmpl $0x0, -0x4c(%rbp)
jl 0x881f
movq -0x48(%rbp), %rax
movslq -0x4c(%rbp), %rcx
cmpl $0x0, (%rax,%rcx,4)
je 0x8812
movq -0x48(%rbp), %rax
movslq -0x4c(%rbp), %rcx
movl (%rax,%rcx,4), %esi
leaq 0x1a6cb(%rip), %rdi     # 0x22ed8
callq 0x7c10
jmp 0x8814
movl -0x4c(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x4c(%rbp)
jmp 0x87e7
movq -0x40(%rbp), %rsi
leaq 0xbb26(%rip), %rdi      # 0x14350
callq 0x3e80
movq -0x30(%rbp), %rax
movslq -0x34(%rbp), %rcx
movl (%rax,%rcx,4), %esi
leaq 0x1a697(%rip), %rdi     # 0x22ed8
callq 0x7c10
jmp 0x8848
movl -0x34(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x34(%rbp)
jmp 0x8791
movq -0x28(%rbp), %rsi
leaq 0xbaef(%rip), %rdi      # 0x14350
callq 0x3e80
movq -0x58(%rbp), %rax
movslq -0x1c(%rbp), %rcx
movl 0x20(%rax,%rcx,4), %esi
leaq 0x1a65f(%rip), %rdi     # 0x22ed8
callq 0x7c10
movq -0x58(%rbp), %rax
movslq -0x1c(%rbp), %rcx
movl $0x0, 0x20(%rax,%rcx,4)
jmp 0x8890
movl -0x1c(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x1c(%rbp)
jmp 0x8731
movq -0x58(%rbp), %rax
movl $0x0, 0x1c(%rax)
movl (%rax), %ecx
orl $0x2, %ecx
movl %ecx, (%rax)
movl 0x4(%rax), %ecx
andl $0xffffefff, %ecx       # imm = 0xFFFFEFFF
movl %ecx, 0x4(%rax)
movl $0x1, 0xc(%rax)
addq $0x60, %rsp
popq %rbp
retq
nopl (%rax)