comparison lwasm/pseudo.c @ 356:7166254491ed

Finished pseudo ops
author lost@starbug
date Wed, 31 Mar 2010 18:46:32 -0600
parents 60568b123281
children d96c30e60ddf
comparison
equal deleted inserted replaced
355:981e34165e97 356:7166254491ed
19 19
20 */ 20 */
21 21
22 #include <config.h> 22 #include <config.h>
23 23
24 #include <stdio.h>
25
24 #include "lwasm.h" 26 #include "lwasm.h"
25 #include "instab.h" 27 #include "instab.h"
28 #include "input.h"
26 29
27 #include "lw_string.h" 30 #include "lw_string.h"
28 31
29 // for "end" 32 // for "end"
30 PARSEFUNC(pseudo_parse_end) 33 PARSEFUNC(pseudo_parse_end)
910 PARSEFUNC(pseudo_parse_error) 913 PARSEFUNC(pseudo_parse_error)
911 { 914 {
912 lwasm_register_error(as, l, "User error: %s", *p); 915 lwasm_register_error(as, l, "User error: %s", *p);
913 skip_operand(p); 916 skip_operand(p);
914 } 917 }
918
919 PARSEFUNC(pseudo_parse_includebin)
920 {
921 char *fn, *p2;
922 int delim = 0;
923 FILE *fp;
924 long flen;
925
926 if (!**p)
927 {
928 lwasm_register_error(as, l, "Missing filename");
929 return;
930 }
931
932 if (**p == '"' || **p == '\'')
933 {
934 delim = **p;
935 (*p)++;
936
937 for (p2 = *p; *p2 && *p2 != delim; p2++)
938 /* do nothing */ ;
939 }
940 else
941 {
942 for (p2 = *p; *p2 && !isspace(*p2); p2++)
943 /* do nothing */ ;
944 }
945 fn = lw_strndup(*p, p2 - *p);
946
947 if (delim && **p)
948 (*p)++;
949
950 fp = input_open_standalone(as, fn);
951 if (!fp)
952 {
953 lwasm_register_error(as, l, "Cannot open file");
954 lw_free(fn);
955 return;
956 }
957
958 l -> lstr = fn;
959
960 fseek(fp, 0, SEEK_END);
961 flen = ftell(fp);
962 fclose(fp);
963
964 l -> len = flen;
965 }
966
967 EMITFUNC(pseudo_emit_includebin)
968 {
969 FILE *fp;
970 int c;
971
972 fp = input_open_standalone(as, l -> lstr);
973 if (!fp)
974 {
975 lwasm_register_error(as, l, "Cannot open file (emit)!");
976 return;
977 }
978
979 for (;;)
980 {
981 c = fgetc(fp);
982 if (c == EOF)
983 {
984 fclose(fp);
985 return;
986 }
987 lwasm_emit(l, c);
988 }
989 }
990
991 PARSEFUNC(pseudo_parse_include)
992 {
993 char *fn, *p2;
994 int delim = 0;
995
996 if (!**p)
997 {
998 lwasm_register_error(as, l, "Missing filename");
999 return;
1000 }
1001
1002 if (**p == '"' || **p == '\'')
1003 {
1004 delim = **p;
1005 (*p)++;
1006
1007 for (p2 = *p; *p2 && *p2 != delim; p2++)
1008 /* do nothing */ ;
1009 }
1010 else
1011 {
1012 for (p2 = *p; *p2 && !isspace(*p2); p2++)
1013 /* do nothing */ ;
1014 }
1015 fn = lw_strndup(*p, p2 - *p);
1016
1017 if (delim && **p)
1018 (*p)++;
1019
1020 input_open(as, fn);
1021
1022 l -> len = 0;
1023 }
1024
1025 PARSEFUNC(pseudo_parse_align)
1026 {
1027 lw_expr_t e;
1028
1029 if (!**p)
1030 {
1031 lwasm_register_error(as, l, "Bad operand");
1032 return;
1033 }
1034
1035 e = lwasm_parse_expr(as, p);
1036 if (!e)
1037 {
1038 lwasm_register_error(as, l, "Bad operand");
1039 return;
1040 }
1041
1042 lwasm_save_expr(l, 0, e);
1043
1044 if (**p == ',')
1045 {
1046 e = lwasm_parse_expr(as, p);
1047 }
1048 else
1049 {
1050 e = lw_expr_build(lw_expr_type_int, 0);
1051 }
1052 if (!e)
1053 {
1054 lwasm_register_error(as, l, "Bad padding");
1055 return;
1056 }
1057
1058 lwasm_save_expr(l, 1, e);
1059 }
1060
1061 RESOLVEFUNC(pseudo_resolve_align)
1062 {
1063 lw_expr_t e;
1064 int align;
1065
1066 e = lwasm_fetch_expr(l, 0);
1067
1068 if (lw_expr_istype(e, lw_expr_type_int))
1069 {
1070 align = lw_expr_intval(e);
1071 if (align < 1)
1072 {
1073 lwasm_register_error(as, l, "Invalid alignment");
1074 return;
1075 }
1076 }
1077
1078 if (lw_expr_istype(l -> addr, lw_expr_type_int))
1079 {
1080 int a;
1081 a = lw_expr_intval(l -> addr);
1082 if (a % align == 0)
1083 {
1084 l -> len = 0;
1085 return;
1086 }
1087 l -> len = align - (a % align);
1088 return;
1089 }
1090 }
1091
1092 EMITFUNC(pseudo_emit_align)
1093 {
1094 lw_expr_t e;
1095 int i;
1096
1097 e = lwasm_fetch_expr(l, 1);
1098 for (i = 0; i < l -> len; i++)
1099 {
1100 lwasm_emitexpr(l, e, 1);
1101 }
1102 }