#include "__write.h" #include "Exception.h" #include "Operand.h" #include #include #include namespace jet { __write::__write(coreutils::ZString &in, coreutils::MString &parentOut, Global &global, Tag *parent, Tag *local) : Tag(in, parentOut, global, parent, local) { output = false; int mode = 0; int len; processContainer(container); if(!keywordDefined("file")) throw coreutils::Exception("write tag must have file defined."); resolveKeyword("file"); if(!keywordDefined("expr") && keywordDefined("value") && hasContainer) throw coreutils::Exception("write tag cannot have both value and a container."); if(keywordDefined("expr") && !keywordDefined("value") && hasContainer) throw coreutils::Exception("write tag cannot have both expr and a container."); if(keywordDefined("expr") && keywordDefined("value") && !hasContainer) throw coreutils::Exception("write tag cannot have both expr and value."); if(!keywordDefined("expr") && !keywordDefined("value") && !hasContainer) throw coreutils::Exception("write tag must have a value, expr or a container."); if(!keywordDefined("mode")) throw coreutils::Exception("write tag must have a mode keyword."); resolveKeyword("mode"); if(keywords["mode"] == "append") mode = O_APPEND; else if(keywords["mode"] == "overwrite") mode = O_TRUNC; else throw coreutils::Exception("mode keyword must be 'overwrite' or 'append'."); int fd = open(keywords["file"].c_str(), mode, 0644); // TODO: Need to add O_CREAT and AUTH flags. if(hasContainer && !evaluate) len = write(fd, container.getData(), container.getLength()); else if(hasContainer && evaluate) len = write(fd, out.getData(), out.getLength()); else if(!hasContainer && keywordDefined("value")) len = write(fd, variables["value"].getData(), keywords["value"].getLength()); else if(!hasContainer && keywordDefined("expr")) len = write(fd, keywords["expr"].getData(), keywords["expr"].getLength()); close(fd); } }