I mean, I can debug somewhat better now, but I need to figure out why I can't read files very well. Maybe I should read smaller chunks of a file...
This commit is contained in:
parent
2f09dd8c91
commit
f1ae7f9e31
|
@ -0,0 +1,56 @@
|
||||||
|
#include "Autojerk.h"
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
Markov _markov;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void OpenAutojerkSourceFile(Point originPoint){
|
||||||
|
|
||||||
|
StandardFileReply reply; //A struct that will contain our result.
|
||||||
|
SFTypeList autojerkTypeList = {'TEXT',' ',' ',' '}; //The list of appropriate types we're okay with opening. These, I think, are the 4-letter creator codes?
|
||||||
|
|
||||||
|
short fileID;
|
||||||
|
|
||||||
|
StandardGetFile(NULL, 1, autojerkTypeList, &reply);
|
||||||
|
|
||||||
|
if (!reply.sfGood) {
|
||||||
|
//Str255 errorDescription =
|
||||||
|
PikaAlertWithText("\pThere was an error opening that file. Perhaps another application may have locked it?");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
//Read no more than 75% of the memory available to the application into memory.
|
||||||
|
//...though this won't take into account any changes made to the memory size made by the user.
|
||||||
|
|
||||||
|
OSErr err;
|
||||||
|
ControlRef control;
|
||||||
|
|
||||||
|
long count = 0.4 * programSize;
|
||||||
|
|
||||||
|
_markov.setRefNumber(reply.sfFile.vRefNum);
|
||||||
|
|
||||||
|
|
||||||
|
//Attempt to open the file's data fork.
|
||||||
|
err = FSpOpenDF(&reply.sfFile, fsRdPerm, &reply.sfFile.vRefNum);
|
||||||
|
if (err != noErr) PikaAlertWithText("\pFSpOpenDF failed in OpenAutojerkSourceFile, so nothing can be read.");
|
||||||
|
|
||||||
|
//Set our file position to the start of the file.
|
||||||
|
SetFPos(reply.sfFile.vRefNum, fsFromStart, 0);
|
||||||
|
|
||||||
|
|
||||||
|
char * readBuffer = (char *)calloc(count+1, sizeof(char));
|
||||||
|
if (readBuffer == NULL) PikaAlertWithText("\pThe read buffer could not be allocated. You or the application may be out of memory.");
|
||||||
|
|
||||||
|
|
||||||
|
err = FSRead(_markov.getRefNumber(), &count, readBuffer); //Read bytes into readBuffer EOF or count bytes have been read, whichever is less.
|
||||||
|
if (err != noErr && err != eofErr) PikaAlertWithText("\pAn error (other than reaching the end of the file) occurred while reading the file.");
|
||||||
|
|
||||||
|
_markov.create(readBuffer, 3, 100);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
free(readBuffer);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
#include <MacWindows.h>
|
||||||
|
#include <Quickdraw.h>
|
||||||
|
#include <Dialogs.h>
|
||||||
|
#include <Fonts.h>
|
||||||
|
#include <Events.h>
|
||||||
|
#include <Devices.h>
|
||||||
|
#include <Resources.h>
|
||||||
|
#include <Files.h>
|
||||||
|
#include <StandardFile.h>
|
||||||
|
#include <Types.h>
|
||||||
|
|
||||||
|
#include "constants.h"
|
||||||
|
#include "markov.h"
|
||||||
|
|
||||||
|
extern Markov _markov;
|
||||||
|
|
||||||
|
void OpenAutojerkSourceFile(Point originPoint);
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
#include "Dialogs.r"
|
||||||
|
#include "constants.h"
|
||||||
|
|
||||||
|
|
||||||
|
resource 'DLOG' (dlogAutojerkResult){ //Purgeable?
|
||||||
|
{0, 0, 280, 480},
|
||||||
|
dBoxProc,
|
||||||
|
visible,
|
||||||
|
goAway, //Revisit this
|
||||||
|
0,
|
||||||
|
ditlAutojerkResult,
|
||||||
|
"AutoJerk Result",
|
||||||
|
centerMainScreen
|
||||||
|
};
|
||||||
|
|
||||||
|
resource 'DITL' (ditlAutojerkResult, purgeable){
|
||||||
|
{
|
||||||
|
{ 240, 150, 260, 290},
|
||||||
|
Button {enabled, "Uh..."};
|
||||||
|
|
||||||
|
{ 240-5, 150-5, 260+5, 290+5 },
|
||||||
|
UserItem {enabled};
|
||||||
|
|
||||||
|
{12, 112, 220, 460},
|
||||||
|
StaticText { disabled, "^0^1^2^3"}; //use ^0 as the placeholder when ready to test it
|
||||||
|
|
||||||
|
{ 25, 10, 95, 105 },
|
||||||
|
Picture {enabled, pictPikawow};
|
||||||
|
}
|
||||||
|
};
|
|
@ -8,11 +8,15 @@ cmake_minimum_required(VERSION 2.8)
|
||||||
|
|
||||||
add_application(MemeveyPro
|
add_application(MemeveyPro
|
||||||
constants.h
|
constants.h
|
||||||
main.c
|
main.cpp
|
||||||
MainApp.c
|
MainApp.cpp
|
||||||
dialog.r
|
dialog.r
|
||||||
menus.r
|
menus.r
|
||||||
pika.r
|
pika.r
|
||||||
|
markov.h
|
||||||
|
Autojerk.r
|
||||||
|
Autojerk.cpp
|
||||||
|
Error.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
# Enable -ffunction-sections and -gc-sections to make the app as small as possible
|
# Enable -ffunction-sections and -gc-sections to make the app as small as possible
|
||||||
|
|
|
@ -0,0 +1,54 @@
|
||||||
|
#include "Error.h"
|
||||||
|
|
||||||
|
pascal void ButtonFrameDraw(DialogRef dlg, DialogItemIndex itemNo){
|
||||||
|
DialogItemType type;
|
||||||
|
Handle itemH;
|
||||||
|
Rect box;
|
||||||
|
|
||||||
|
GetDialogItem(dlg, 1, &type, &itemH, &box);
|
||||||
|
InsetRect(&box, -4, -4);
|
||||||
|
PenSize(3,3);
|
||||||
|
FrameRoundRect(&box,16,16);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void NoteAlertWithText(ConstStr255Param inString){
|
||||||
|
ParamText(inString,"\p","\p","\p");
|
||||||
|
NoteAlert(alrtGenericTextless, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CautionAlertWithText(ConstStr255Param inString){
|
||||||
|
ParamText(inString,"\p","\p","\p");
|
||||||
|
CautionAlert(alrtGenericTextless, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void StopAlertWithText(ConstStr255Param inString){
|
||||||
|
ParamText(inString,"\p","\p","\p");
|
||||||
|
StopAlert(alrtGenericTextless, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PikaAlertWithText(ConstStr255Param inString){
|
||||||
|
DialogPtr pikaAlert = GetNewDialog(dlogPikaAlert, 0, (WindowPtr)-1);
|
||||||
|
DialogItemType type;
|
||||||
|
Handle itemH;
|
||||||
|
Rect box;
|
||||||
|
short item;
|
||||||
|
|
||||||
|
MacSetPort(pikaAlert);
|
||||||
|
UpdateDialog(pikaAlert, pikaAlert->visRgn);
|
||||||
|
|
||||||
|
GetDialogItem(pikaAlert, 2, &type, &itemH, &box);
|
||||||
|
SetDialogItem(pikaAlert, 2, type, (Handle) NewUserItemUPP(&ButtonFrameDraw), &box);
|
||||||
|
|
||||||
|
SelectWindow(pikaAlert);
|
||||||
|
|
||||||
|
ParamText(inString,"\p","\p","\p");
|
||||||
|
|
||||||
|
do {
|
||||||
|
ModalDialog(NULL, &item);
|
||||||
|
} while(item != 1);
|
||||||
|
|
||||||
|
FlushEvents(everyEvent, 0);
|
||||||
|
DisposeWindow(pikaAlert);
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,21 @@
|
||||||
|
#include <MacWindows.h>
|
||||||
|
#include <Quickdraw.h>
|
||||||
|
#include <Dialogs.h>
|
||||||
|
#include <Fonts.h>
|
||||||
|
#include <Events.h>
|
||||||
|
#include <Devices.h>
|
||||||
|
#include <Resources.h>
|
||||||
|
#include <Types.h>
|
||||||
|
|
||||||
|
|
||||||
|
#include "constants.h"
|
||||||
|
|
||||||
|
//Convenient ways to call errors with custom text, when combined with the appropriate ditl and alrt in dialog.r
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void NoteAlertWithText(ConstStr255Param inString);
|
||||||
|
void CautionAlertWithText(ConstStr255Param inString);
|
||||||
|
void StopAlertWithText(ConstStr255Param inString);
|
||||||
|
|
||||||
|
void PikaAlertWithText(ConstStr255Param inString);
|
|
@ -1,9 +1,8 @@
|
||||||
#include "MainApp.h"
|
#include "MainApp.h"
|
||||||
|
|
||||||
|
|
||||||
DialogPtr _mainDialog;
|
DialogPtr _mainDialog;
|
||||||
char _run = 1; //Set this to 0 when it's time to quit.
|
char _run = 1; //Set this to 0 when it's time to quit.
|
||||||
int _activeDITL = ditlMain; //This keeps track of the current UI that _mainDialog displays.
|
|
||||||
|
|
||||||
pascal void ButtonFrameProc(DialogRef dlg, DialogItemIndex itemNo){
|
pascal void ButtonFrameProc(DialogRef dlg, DialogItemIndex itemNo){
|
||||||
DialogItemType type;
|
DialogItemType type;
|
||||||
Handle itemH;
|
Handle itemH;
|
||||||
|
@ -39,15 +38,55 @@ void PresentAboutBox(){
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void PresentUnimplementedDlog(){
|
void PresentAutojerkResult(){
|
||||||
|
|
||||||
CautionAlert(alrtUnimplemented, NULL);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
DialogPtr autojerkResultDialog = GetNewDialog(dlogAutojerkResult, 0, (WindowPtr)-1);
|
||||||
|
DialogItemType type;
|
||||||
|
Handle itemH;
|
||||||
|
Rect box;
|
||||||
|
short item;
|
||||||
|
|
||||||
|
GetDialogItem(autojerkResultDialog, 2, &type, &itemH, &box);
|
||||||
|
SetDialogItem(autojerkResultDialog, 2, type, (Handle) NewUserItemUPP(&ButtonFrameProc), &box);
|
||||||
|
|
||||||
|
MacSetPort(autojerkResultDialog);
|
||||||
|
UpdateDialog(autojerkResultDialog, autojerkResultDialog->visRgn);
|
||||||
|
|
||||||
|
SelectWindow(autojerkResultDialog);
|
||||||
|
|
||||||
|
/*The strings you pass in the parameters to ParamText cannot contain the special strings
|
||||||
|
^0 through ^3, or else the procedure will enter an endless loop of substitutions in
|
||||||
|
versions of system software earlier than 7.1.*/
|
||||||
|
if (!_markov.isInitialized()){
|
||||||
|
//Return an error eventually.
|
||||||
|
ParamText("\pThe Markov Object has not been initialized yet. Try opening a file.","\p","\p","\p");
|
||||||
|
do {
|
||||||
|
ModalDialog(NULL, &item);
|
||||||
|
} while(item != 1);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
//ParamText(myString,myString,myString,myString);
|
||||||
|
ParamText("\pThe code to actually generate stuff hasn't been written yet...","\p","\p","\p");
|
||||||
|
do {
|
||||||
|
ModalDialog(NULL, &item);
|
||||||
|
} while(item != 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
FlushEvents(everyEvent, 0);
|
||||||
|
DisposeWindow(autojerkResultDialog);
|
||||||
|
|
||||||
|
MacSetPort(_mainDialog);
|
||||||
|
}
|
||||||
|
|
||||||
|
void PresentUnimplementedDlog(){
|
||||||
|
//CautionAlert(alrtUnimplemented, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PresentMainDlog(){
|
void PresentMainDlog(){
|
||||||
_mainDialog = GetNewWindow(windMain, 0, (WindowPtr)-1);
|
//_mainDialog = GetNewWindow(windMain, 0, (WindowPtr)-1);
|
||||||
//_mainDialog = GetNewDialog(dlogMain, 0, (WindowPtr)-1);
|
_mainDialog = GetNewDialog(dlogMain, 0, (WindowPtr)-1);
|
||||||
//SwitchDITL(ditlMain);
|
//SwitchDITL(ditlMain);
|
||||||
//Do anything else.
|
//Do anything else.
|
||||||
}
|
}
|
||||||
|
@ -55,6 +94,7 @@ void PresentMainDlog(){
|
||||||
//Changes the UI of the main dialog.
|
//Changes the UI of the main dialog.
|
||||||
//This lets us keep one dialog box around and just change its guts.
|
//This lets us keep one dialog box around and just change its guts.
|
||||||
//The only problem is that I have never gotten this to work, so...
|
//The only problem is that I have never gotten this to work, so...
|
||||||
|
/*
|
||||||
void SwitchDITL(short int toDitlID){
|
void SwitchDITL(short int toDitlID){
|
||||||
_activeDITL = toDitlID;
|
_activeDITL = toDitlID;
|
||||||
|
|
||||||
|
@ -67,9 +107,9 @@ void SwitchDITL(short int toDitlID){
|
||||||
AppendDITL(_mainDialog, newDitl, overlayDITL);
|
AppendDITL(_mainDialog, newDitl, overlayDITL);
|
||||||
ReleaseResource(newDitl);
|
ReleaseResource(newDitl);
|
||||||
|
|
||||||
//UpdateDialog(_mainDialog, _mainDialog->visRgn);
|
UpdateDialog(_mainDialog, _mainDialog->visRgn);
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
//
|
//
|
||||||
// Event Processing
|
// Event Processing
|
||||||
|
@ -80,7 +120,7 @@ void EventLoop(){
|
||||||
|
|
||||||
//For now, present the main dialog here.
|
//For now, present the main dialog here.
|
||||||
PresentMainDlog();
|
PresentMainDlog();
|
||||||
|
|
||||||
//Essentially, the app's main loop.
|
//Essentially, the app's main loop.
|
||||||
while (_run){
|
while (_run){
|
||||||
if (WaitNextEvent(everyEvent, &event, 0, NULL)){
|
if (WaitNextEvent(everyEvent, &event, 0, NULL)){
|
||||||
|
@ -93,6 +133,7 @@ void EventLoop(){
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//For the "Crash Computer" option: Just try opening a DITL/DLOG that doesn't exist, or something :thonk:
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,7 +193,11 @@ void HandleMouseDown(EventRecord *eventPtr){
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case inGoAway: //with "goAway" being the close box
|
case inGoAway: //with "goAway" being the close box
|
||||||
if (TrackGoAway(window, eventPtr->where)) QuitApp();
|
if (TrackGoAway(window, eventPtr->where)){
|
||||||
|
//We can do other things here, but for now...
|
||||||
|
QuitApp();
|
||||||
|
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -176,7 +221,7 @@ void HandleMenuChoice(long menuChoice){
|
||||||
}
|
}
|
||||||
else if (menuID == menuUser){
|
else if (menuID == menuUser){
|
||||||
switch (menuItem){
|
switch (menuItem){
|
||||||
case menuItemQuit:
|
case menuitemQuit:
|
||||||
QuitApp();
|
QuitApp();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -184,6 +229,22 @@ void HandleMenuChoice(long menuChoice){
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (menuID == menuAutojerk){
|
||||||
|
switch (menuItem){
|
||||||
|
case menuitemAutojerkGenerate:
|
||||||
|
PresentAutojerkResult();
|
||||||
|
break;
|
||||||
|
case menuitemAutojerkOpenFile:
|
||||||
|
Point origin;
|
||||||
|
origin.h = 80;
|
||||||
|
origin.v = 80;
|
||||||
|
OpenAutojerkSourceFile(origin);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
PresentUnimplementedDlog();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
PresentUnimplementedDlog();
|
PresentUnimplementedDlog();
|
||||||
}
|
}
|
||||||
|
@ -206,25 +267,30 @@ void HandleUpdate(EventRecord *eventPtr){
|
||||||
void HandleInContent(EventRecord *eventPtr){
|
void HandleInContent(EventRecord *eventPtr){
|
||||||
//Todo
|
//Todo
|
||||||
WindowPtr window;
|
WindowPtr window;
|
||||||
short int part;
|
DialogPtr dialog;
|
||||||
|
short part, item;
|
||||||
|
|
||||||
part = FindWindow(eventPtr->where, &window);
|
part = FindWindow(eventPtr->where, &window);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//SelectWindow(window); //Bring the clicked window to the front.
|
||||||
|
|
||||||
//Drag the window if CMD is held down.
|
//Drag the window if CMD is held down.
|
||||||
if ((eventPtr->modifiers & cmdKey) != 0)
|
if ((eventPtr->modifiers & cmdKey) != 0) DragWindow(window, eventPtr->where, &qd.screenBits.bounds);
|
||||||
DragWindow(window, eventPtr->where, &qd.screenBits.bounds);
|
|
||||||
|
if (DialogSelect(eventPtr, &dialog, &item)){
|
||||||
else //For now, drag the window anyway.
|
if (dialog == _mainDialog) DragWindow(window, eventPtr->where, &qd.screenBits.bounds); //We'll do something more here later...
|
||||||
DragWindow(window, eventPtr->where, &qd.screenBits.bounds);
|
else {} //Do nothing for now
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void QuitApp(){
|
void QuitApp(){
|
||||||
_run = 0; //Now, the EventLoop will stop.
|
_run = 0; //Now, the EventLoop will stop.
|
||||||
//Do any clean-up here.
|
//Do any clean-up here.
|
||||||
CloseWindow(_mainDialog);
|
//CloseWindow(_mainDialog);
|
||||||
//CloseDialog(_mainDialog);
|
CloseDialog(_mainDialog);
|
||||||
//ExitToShell();
|
//ExitToShell();
|
||||||
//For now, there isn't much else to do.
|
//For now, there isn't much else to do.
|
||||||
|
|
|
@ -5,8 +5,12 @@
|
||||||
#include <Events.h>
|
#include <Events.h>
|
||||||
#include <Devices.h>
|
#include <Devices.h>
|
||||||
#include <Resources.h>
|
#include <Resources.h>
|
||||||
|
#include <Types.h>
|
||||||
|
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
|
#include "Autojerk.h"
|
||||||
|
|
||||||
extern DialogPtr _mainDialog;
|
extern DialogPtr _mainDialog;
|
||||||
|
|
||||||
|
|
|
@ -6,10 +6,18 @@
|
||||||
</Plugin>
|
</Plugin>
|
||||||
</Plugins>
|
</Plugins>
|
||||||
<VirtualDirectory Name="MemeveyPro-m68k">
|
<VirtualDirectory Name="MemeveyPro-m68k">
|
||||||
|
<File Name="Error.cpp"/>
|
||||||
|
<File Name="Error.h"/>
|
||||||
|
<File Name="Autojerk.cpp"/>
|
||||||
|
<File Name="Autojerk.h"/>
|
||||||
|
<File Name="main.cpp"/>
|
||||||
|
<File Name="MainApp.cpp"/>
|
||||||
|
<File Name="Autojerk.r"/>
|
||||||
|
<File Name="menus.r"/>
|
||||||
|
<File Name="dialog.r"/>
|
||||||
|
<File Name="markov.h"/>
|
||||||
<File Name="constants.h"/>
|
<File Name="constants.h"/>
|
||||||
<File Name="main.c"/>
|
|
||||||
<File Name="MainApp.h"/>
|
<File Name="MainApp.h"/>
|
||||||
<File Name="MainApp.c"/>
|
|
||||||
</VirtualDirectory>
|
</VirtualDirectory>
|
||||||
<VirtualDirectory Name="build">
|
<VirtualDirectory Name="build">
|
||||||
<VirtualDirectory Name="CMakeFiles">
|
<VirtualDirectory Name="CMakeFiles">
|
||||||
|
|
59
constants.h
59
constants.h
|
@ -1,6 +1,9 @@
|
||||||
|
|
||||||
// constants
|
// constants
|
||||||
|
|
||||||
|
//This is probably one of the dumber things I've ever done on a project like this.
|
||||||
|
//More importantly, this might be better-organized as a bunch of separate files.
|
||||||
|
|
||||||
/*Default Menu Bar*/
|
/*Default Menu Bar*/
|
||||||
#define defaultMenubar 128
|
#define defaultMenubar 128
|
||||||
|
|
||||||
|
@ -10,44 +13,54 @@
|
||||||
#define menuitemAbout 1
|
#define menuitemAbout 1
|
||||||
|
|
||||||
|
|
||||||
/*Pets Menu*/
|
//User Menu
|
||||||
#define menuPets 129
|
#define menuUser 129
|
||||||
|
|
||||||
#define menuitemMyPets 1
|
#define menuitemQuit 1 //Make sure this matches up with the position of the correct item in the menu
|
||||||
#define menuitemNewPet 2
|
|
||||||
|
//AutoJerk Menu
|
||||||
|
#define menuAutojerk 130
|
||||||
|
|
||||||
|
#define menuitemAutojerkOpenFile 1
|
||||||
|
//Divider at 2
|
||||||
|
#define menuitemAutojerkGenerate 3
|
||||||
|
|
||||||
//
|
//
|
||||||
#define menuUser 131
|
#define menuHelp 200
|
||||||
|
|
||||||
#define menuitemLogin 1
|
|
||||||
#define menuItemLogout 2
|
|
||||||
#define menuItemQuit 4
|
|
||||||
|
|
||||||
//
|
|
||||||
#define menuRandom 132
|
|
||||||
|
|
||||||
#define menuAutoJerk 1
|
|
||||||
|
|
||||||
#define menuFuck 255
|
|
||||||
|
|
||||||
//
|
|
||||||
#define menuHelp 130
|
|
||||||
|
|
||||||
#define menuitemHelp 1
|
#define menuitemHelp 1
|
||||||
|
|
||||||
|
//
|
||||||
|
#define menuFuck 255
|
||||||
|
|
||||||
|
|
||||||
/*Dialogs, Alerts, and DITLs*/
|
/*Dialogs, Alerts, and DITLs*/
|
||||||
#define dlogAbout 128
|
#define dlogAbout 128
|
||||||
#define ditlAbout 128
|
#define ditlAbout 128
|
||||||
|
|
||||||
#define alrtUnimplemented 129
|
#define alrtGenericTextless 129
|
||||||
#define ditlUnimplemented 129
|
#define ditlGenericTextless 129
|
||||||
|
|
||||||
#define windMain 130
|
#define windMain 130
|
||||||
#define dlogMain 130
|
#define dlogMain 130
|
||||||
#define ditlMain 130
|
#define ditlMain 130
|
||||||
|
|
||||||
|
|
||||||
#define dlogMainSmall 131
|
#define dlogPikaAlert 131
|
||||||
#define ditlMainSmall 131
|
#define ditlPikaAlert 131
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//AutoJerk
|
||||||
|
|
||||||
|
#define ditlAutojerkOpenFile 200
|
||||||
|
#define dlogAutojerkOpenFile 200
|
||||||
|
|
||||||
|
#define ditlAutojerkResult 201
|
||||||
|
#define dlogAutojerkResult 201
|
||||||
|
|
||||||
|
//Picture Resources
|
||||||
|
#define pictPikawow 128
|
||||||
|
|
||||||
|
//Other Program Parameters
|
||||||
|
#define programSize 1000 * 1024 //1000 * 1 kB
|
51
dialog.r
51
dialog.r
|
@ -26,14 +26,44 @@ resource 'DITL' (ditlAbout, purgeable) {
|
||||||
StaticText {enabled, "MemeveyPro-m68k 0.0.0\rBy Zac Silverman (macosten)"};
|
StaticText {enabled, "MemeveyPro-m68k 0.0.0\rBy Zac Silverman (macosten)"};
|
||||||
|
|
||||||
{ 25, 10, 95, 105 },
|
{ 25, 10, 95, 105 },
|
||||||
Picture {enabled, 128};
|
Picture {enabled, pictPikawow};
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
resource 'ALRT' (alrtUnimplemented, purgeable) {
|
resource 'DLOG' (dlogPikaAlert, purgeable) {
|
||||||
|
//Top Left Bottom Right
|
||||||
|
{ 0, 0, 145, 350 },
|
||||||
|
dBoxProc,
|
||||||
|
visible,
|
||||||
|
noGoAway, //No close box
|
||||||
|
0,
|
||||||
|
ditlPikaAlert,
|
||||||
|
"About MemeveyPro-m68k",
|
||||||
|
centerMainScreen
|
||||||
|
};
|
||||||
|
|
||||||
|
resource 'DITL' (ditlPikaAlert, purgeable) {
|
||||||
|
{
|
||||||
|
// Top Left Bottom Right
|
||||||
|
{ 110, 200, 130, 320 },
|
||||||
|
Button { enabled, "OK" };
|
||||||
|
|
||||||
|
{ 110-5, 200-5, 130+5, 320+5 },
|
||||||
|
UserItem {enabled};
|
||||||
|
|
||||||
|
{ 30, 110, 100, 350 },
|
||||||
|
StaticText {enabled, "^0"};
|
||||||
|
|
||||||
|
{ 25, 10, 95, 105 },
|
||||||
|
Picture {enabled, pictPikawow};
|
||||||
|
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
resource 'ALRT' (alrtGenericTextless, purgeable) {
|
||||||
{ 0, 0, 90, 400 },
|
{ 0, 0, 90, 400 },
|
||||||
ditlUnimplemented,
|
ditlGenericTextless,
|
||||||
{
|
{
|
||||||
OK, visible, sound1,
|
OK, visible, sound1,
|
||||||
OK, visible, sound1,
|
OK, visible, sound1,
|
||||||
|
@ -43,13 +73,13 @@ resource 'ALRT' (alrtUnimplemented, purgeable) {
|
||||||
alertPositionMainScreen
|
alertPositionMainScreen
|
||||||
};
|
};
|
||||||
|
|
||||||
resource 'DITL' (ditlUnimplemented, purgeable){
|
resource 'DITL' (alrtGenericTextless, purgeable){
|
||||||
{
|
{
|
||||||
{56, 300, 56+20, 380},
|
{56, 300, 56+20, 380},
|
||||||
Button {enabled, "OK"};
|
Button {enabled, "OK"};
|
||||||
|
|
||||||
{8, 72, 38, 380},
|
{8, 72, 38, 380},
|
||||||
StaticText { disabled, "This functionality has not yet been implemented."};
|
StaticText { disabled, "^0"}; //There was an error opening that file. Try a different file, or try again later/after a restart.
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -77,7 +107,7 @@ resource 'DLOG' (dlogMain){ //Purgeable?
|
||||||
resource 'DITL' (ditlMain, purgeable){
|
resource 'DITL' (ditlMain, purgeable){
|
||||||
{
|
{
|
||||||
{10, 10, 40, 300},
|
{10, 10, 40, 300},
|
||||||
StaticText {disabled, "MemeveyPro Main Window."};
|
StaticText {disabled, "Memevey Pro Main Window."};
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -100,11 +130,6 @@ resource 'SIZE' (-1) {
|
||||||
reserved,
|
reserved,
|
||||||
reserved,
|
reserved,
|
||||||
reserved,
|
reserved,
|
||||||
#ifdef TARGET_API_MAC_CARBON
|
1000 * 1024,
|
||||||
500 * 1024, // Carbon apparently needs additional memory.
|
1000 * 1024
|
||||||
500 * 1024
|
|
||||||
#else
|
|
||||||
200 * 1024,
|
|
||||||
200 * 1024
|
|
||||||
#endif
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
#include "MainApp.h"
|
#include "MainApp.h"
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
|
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
#ifndef TARGET_API_MAC_CARBON
|
#ifndef TARGET_API_MAC_CARBON
|
||||||
/* NOTE: this is checking whether the Dialogs.h we use *knows* about Carbon,
|
/* NOTE: this is checking whether the Dialogs.h we use *knows* about Carbon,
|
||||||
not whether we are actually compiling for Cabon.
|
not whether we are actually compiling for Cabon.
|
||||||
|
@ -39,7 +42,11 @@ void Initialize() {
|
||||||
//Draw the menu bar
|
//Draw the menu bar
|
||||||
DrawMenuBar();
|
DrawMenuBar();
|
||||||
|
|
||||||
|
//Seed the random number generator. There's a Macintosh Toolbox call for this, I think, but I forget what it was.
|
||||||
|
srand(time(0));
|
||||||
|
|
||||||
//Do anything else.
|
//Do anything else.
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,115 @@
|
||||||
|
#include <algorithm>
|
||||||
|
#include <string>
|
||||||
|
#include <string.h>
|
||||||
|
#include <vector>
|
||||||
|
#include <map>
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct AutojerkStrings {
|
||||||
|
Str255 strings[4];
|
||||||
|
} AutojerkStrings;
|
||||||
|
|
||||||
|
class Markov {
|
||||||
|
public:
|
||||||
|
void create( char * readBuffer, unsigned int keyLen, unsigned int words ) {
|
||||||
|
fileBuffer = std::string(readBuffer);
|
||||||
|
if( fileBuffer.length() < 1 ) return;
|
||||||
|
createDictionary( keyLen );
|
||||||
|
initialized = true;
|
||||||
|
}
|
||||||
|
AutojerkStrings createText() {
|
||||||
|
std::string key, first, second, intermediateResult;
|
||||||
|
size_t next;
|
||||||
|
std::map<std::string, std::vector<std::string> >::iterator it = dictionary.begin();
|
||||||
|
std::advance( it, rand() % dictionary.size() );
|
||||||
|
key = ( *it ).first;
|
||||||
|
intermediateResult += key;
|
||||||
|
while( intermediateResult.length() < 1019 ) { //1019 being the capacity of 4 Str255s, minus one for the '!'.
|
||||||
|
std::vector<std::string> d = dictionary[key];
|
||||||
|
if( d.size() < 1 ) break;
|
||||||
|
second = d[rand() % d.size()];
|
||||||
|
if( second.length() < 1 ) break;
|
||||||
|
if (intermediateResult.size() + (" " + second).size() < 1019){
|
||||||
|
intermediateResult += (" " + second); //Keep going if the strings are small enough.
|
||||||
|
} else break;
|
||||||
|
next = key.find_first_of( 32, 0 );
|
||||||
|
first = key.substr( next + 1 );
|
||||||
|
key = first + " " + second;
|
||||||
|
}
|
||||||
|
intermediateResult += "!";
|
||||||
|
|
||||||
|
//Split these strings into 4 (safely).
|
||||||
|
std::vector<std::string> intermediateVector = split(intermediateResult, 4);
|
||||||
|
|
||||||
|
AutojerkStrings result;
|
||||||
|
|
||||||
|
//result.strings[0] = intermediateVector[0].c_str();
|
||||||
|
memcpy(result.strings[0], intermediateVector[0].c_str(), intermediateVector[0].length());
|
||||||
|
//result.strings[1] = intermediateVector[1].c_str();
|
||||||
|
memcpy(result.strings[1], intermediateVector[1].c_str(), intermediateVector[1].length());
|
||||||
|
//result.strings[2] = intermediateVector[2].c_str();
|
||||||
|
memcpy(result.strings[2], intermediateVector[2].c_str(), intermediateVector[2].length());
|
||||||
|
//result.strings[3] = intermediateVector[3].c_str();
|
||||||
|
memcpy(result.strings[3], intermediateVector[3].c_str(), intermediateVector[3].length());
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
bool isInitialized(){
|
||||||
|
return initialized;
|
||||||
|
}
|
||||||
|
|
||||||
|
//For file access purposes, we should keep track of the source file's referece number.
|
||||||
|
short getRefNumber(){
|
||||||
|
return fileRefNum;
|
||||||
|
}
|
||||||
|
void setRefNumber(short newRefNum){
|
||||||
|
fileRefNum = newRefNum;
|
||||||
|
}
|
||||||
|
private:
|
||||||
|
void createDictionary( unsigned int kl ) {
|
||||||
|
std::string w1, key;
|
||||||
|
size_t wc = 0, pos, next;
|
||||||
|
next = fileBuffer.find_first_not_of( 32, 0 );
|
||||||
|
if( next == std::string::npos ) return;
|
||||||
|
while( wc < kl ) {
|
||||||
|
pos = fileBuffer.find_first_of( ' ', next );
|
||||||
|
w1 = fileBuffer.substr( next, pos - next );
|
||||||
|
key += w1 + " ";
|
||||||
|
next = fileBuffer.find_first_not_of( 32, pos + 1 );
|
||||||
|
if( next == std::string::npos ) return;
|
||||||
|
wc++;
|
||||||
|
}
|
||||||
|
key = key.substr( 0, key.size() - 1 );
|
||||||
|
while( true ) {
|
||||||
|
next = fileBuffer.find_first_not_of( 32, pos + 1 );
|
||||||
|
if( next == std::string::npos ) return;
|
||||||
|
pos = fileBuffer.find_first_of( 32, next );
|
||||||
|
w1 = fileBuffer.substr( next, pos - next );
|
||||||
|
if( w1.size() < 1 ) break;
|
||||||
|
if( std::find( dictionary[key].begin(), dictionary[key].end(), w1 ) == dictionary[key].end() )
|
||||||
|
dictionary[key].push_back( w1 );
|
||||||
|
key = key.substr( key.find_first_of( 32 ) + 1 ) + " " + w1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
std::vector<std::string> split(std::string const & s, size_t count){
|
||||||
|
//Split s into count strings of size as close to equal as possible.
|
||||||
|
size_t minsize = s.size()/count;
|
||||||
|
int extra = s.size() - minsize * count;
|
||||||
|
std::vector<std::string> tokens;
|
||||||
|
for(size_t i = 0, offset=0 ; i < count; ++i, --extra){
|
||||||
|
size_t size = minsize + (extra>0?1:0);
|
||||||
|
if ( (offset + size) < s.size())
|
||||||
|
tokens.push_back(s.substr(offset,size));
|
||||||
|
else
|
||||||
|
tokens.push_back(s.substr(offset, s.size() - offset));
|
||||||
|
offset += size;
|
||||||
|
}
|
||||||
|
return tokens;
|
||||||
|
}
|
||||||
|
bool initialized;
|
||||||
|
std::string fileBuffer;
|
||||||
|
std::map<std::string, std::vector<std::string> > dictionary;
|
||||||
|
//Mac-specific info:
|
||||||
|
short fileRefNum;
|
||||||
|
};
|
38
menus.r
38
menus.r
|
@ -3,7 +3,7 @@
|
||||||
#include "constants.h"
|
#include "constants.h"
|
||||||
|
|
||||||
resource 'MBAR' (defaultMenubar, preload) {
|
resource 'MBAR' (defaultMenubar, preload) {
|
||||||
{menuApple, menuUser, menuPets, menuHelp};
|
{menuApple, menuUser, menuAutojerk, menuHelp, menuFuck};
|
||||||
};
|
};
|
||||||
|
|
||||||
/*See Inside Macintosh: Macintosh Toolbox / More Macintosh Toolbox*/
|
/*See Inside Macintosh: Macintosh Toolbox / More Macintosh Toolbox*/
|
||||||
|
@ -19,7 +19,7 @@ resource 'MENU' (menuApple, preload) { /*resource ID, preload resource*/
|
||||||
apple, /*menu title*/
|
apple, /*menu title*/
|
||||||
{
|
{
|
||||||
/*first menu item*/
|
/*first menu item*/
|
||||||
"About PetProject...", /*text of menu item*/
|
"About Memevey Pro...", /*text of menu item*/
|
||||||
noicon, nokey, nomark, plain; /*item characteristics*/
|
noicon, nokey, nomark, plain; /*item characteristics*/
|
||||||
/*second menu item*/
|
/*second menu item*/
|
||||||
"-",
|
"-",
|
||||||
|
@ -28,8 +28,6 @@ resource 'MENU' (menuApple, preload) { /*resource ID, preload resource*/
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
resource 'MENU' (menuUser, preload) {
|
resource 'MENU' (menuUser, preload) {
|
||||||
menuUser,
|
menuUser,
|
||||||
textMenuProc,
|
textMenuProc,
|
||||||
|
@ -37,27 +35,35 @@ resource 'MENU' (menuUser, preload) {
|
||||||
enabled,
|
enabled,
|
||||||
"User",
|
"User",
|
||||||
{
|
{
|
||||||
"Login",
|
|
||||||
noicon, nokey, nomark, plain;
|
|
||||||
"Logout",
|
|
||||||
noicon, nokey, nomark, plain;
|
|
||||||
"-",
|
|
||||||
noicon, nokey, nomark, plain,
|
|
||||||
"Quit",
|
"Quit",
|
||||||
noicon, nokey, nomark, plain
|
noicon, nokey, nomark, plain
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
resource 'MENU' (menuPets, preload) {
|
resource 'MENU' (menuAutojerk, preload) {
|
||||||
menuPets,
|
menuAutojerk,
|
||||||
|
textMenuProc,
|
||||||
|
0b1111111111111111111111111111111,
|
||||||
|
enabled,
|
||||||
|
"AutoJerk",
|
||||||
|
{
|
||||||
|
"Open Input File...",
|
||||||
|
noicon, nokey, nomark, plain,
|
||||||
|
"-",
|
||||||
|
noicon, nokey, nomark, plain,
|
||||||
|
"Generate",
|
||||||
|
noicon, nokey, nomark, plain
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
resource 'MENU' (menuFuck, preload) {
|
||||||
|
menuFuck,
|
||||||
textMenuProc,
|
textMenuProc,
|
||||||
0b1111111111111111111111111111111, /*I assume this enables all items, dunno though.*/
|
0b1111111111111111111111111111111, /*I assume this enables all items, dunno though.*/
|
||||||
enabled,
|
enabled,
|
||||||
"Pets",
|
"Fuck",
|
||||||
{
|
{
|
||||||
"View Pets",
|
"Attempt Overwrite of Low Memory...",
|
||||||
noicon, nokey, nomark, plain;
|
|
||||||
"Create Pet",
|
|
||||||
noicon, nokey, nomark, plain
|
noicon, nokey, nomark, plain
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue