Mercurial > hg-old > index.cgi
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 } |