use crate::traits::Writable;
use crate::Data;
use std::io::prelude::*;
pub enum DataEL {
Byte(i8),
ByteU(u8),
Word(i16),
ShortU(u16),
Long(i32),
LongU(u32),
Quad(i64),
Space(usize),
AddressLong(super::reg::Label),
AddressQuad(super::reg::Label),
Ascii(String),
Asciz(String),
}
impl Writable for DataEL {
fn write_in(&self, file: &mut std::fs::File) -> std::io::Result<()> {
match self {
Self::Byte(el) => {
file.write_all(b"\t.byte ")?;
file.write_all(format!("{:<10}", el).as_bytes())
}
Self::ByteU(el) => {
file.write_all(b"\t.byte ")?;
file.write_all(format!("{:<10}", el).as_bytes())
}
Self::Word(el) => {
file.write_all(b"\t.word ")?;
file.write_all(format!("{:<10}", el).as_bytes())
}
Self::ShortU(el) => {
file.write_all(b"\t.short ")?;
file.write_all(format!("{:<10}", el).as_bytes())
}
Self::Long(el) => {
file.write_all(b"\t.long ")?;
file.write_all(format!("{:<10}", el).as_bytes())
}
Self::LongU(el) => {
file.write_all(b"\t.long ")?;
file.write_all(format!("{:<10}", el).as_bytes())
}
Self::Quad(el) => {
file.write_all(b"\t.quad ")?;
file.write_all(format!("{:<10}", el).as_bytes())
}
Self::AddressLong(el) => {
file.write_all(b"\t.long ")?;
el.write_in(file)
}
Self::AddressQuad(el) => {
file.write_all(b"\t.quad ")?;
el.write_in(file)
}
Self::Ascii(str) => {
file.write_all(b"\t.ascii \"")?;
file.write_all(str.as_bytes())?;
file.write_all(b"\"")
}
Self::Asciz(str) => {
file.write_all(b"\t.asciz \"")?;
file.write_all(str.as_bytes())?;
file.write_all(b"\"")
}
Self::Space(i) => file.write_all(format!("\t.space {}", i).as_bytes()),
}
}
}
pub fn dasciz(data: String) -> Data {
Data::new(DataEL::Asciz(data))
}
pub fn dascii(data: String) -> Data {
Data::new(DataEL::Ascii(data))
}
pub fn dbyte(i: i8) -> Data {
Data::new(DataEL::Byte(i))
}
pub fn dubyte(i: u8) -> Data {
Data::new(DataEL::ByteU(i))
}
pub fn dword(i: i16) -> Data {
Data::new(DataEL::Word(i))
}
pub fn dushort(i: u16) -> Data {
Data::new(DataEL::ShortU(i))
}
pub fn dlong(i: i32) -> Data {
Data::new(DataEL::Long(i))
}
pub fn dulong(i: u32) -> Data {
Data::new(DataEL::LongU(i))
}
pub fn dquad(i: i64) -> Data {
Data::new(DataEL::Quad(i))
}
pub fn daddress(addr: super::reg::Label) -> Data {
Data::new(DataEL::AddressQuad(addr))
}
pub fn dlong_label(addr: super::reg::Label) -> Data {
Data::new(DataEL::AddressLong(addr))
}
pub fn space(i: usize) -> Data {
Data::new(DataEL::Space(i))
}